如何尽快在另一个字符串中查找特定字符串?

Div*_*doo 1 python indexing

我想知道是否有更好/更好/更快的方法来解决以下问题.

如果给定字符串包含"abc"的外观,则返回True,其中abc不直接以句点(.)开头.所以"qabc"很重要,但"r.abc"不计算在内.

我的解决方案是:

def abc_there(string):
    tmp = 0
    for i in xrange(len(string)):
        if string[i:i+3] == "abc" and string[i-1] != ".":
            tmp += 1
    return tmp > 0
Run Code Online (Sandbox Code Playgroud)

编辑:

只是为了澄清:

".abc" - >错误

".abcabc" - >是的

只有句点右侧的实例才会被删除.

pig*_*lei 5

正则表达式是完成此操作的完美工具:

>>> import re
# Test if it contains a match
>>> bool(re.search(r'(?:^|[^.])(abc)', 'testabc funcabc'))
True
>>> bool(re.search(r'(?:^|[^.])(abc)', '.abc'))
False

# Count the number of occurrences
>>> re.findall(r'(?:^|[^.])(abc)', 'abc testabc func.abc')
['abc', 'abc']
>>> len(re.findall(r'(?:^|[^.])(abc)', 'abc testabc func.abc'))
2
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅模块rePython文档.


Dor*_*Ron 5

有一种不那么直截了当的方法可以解决这个问题,而且速度也稍快一些.我的代码:

def xyz_there(string):
    return string.count(".abc") != string.count("abc")
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为如果有一个字符串作为"abc.abc"传递,则".abc"计数将为1,但abc计数将为2但是如果该字符串仅为"fd.abc.abc".它将返回False.

为了证明它更快,我前往IPython.

In [1]: def abc_there(string):
 ...:       tmp = 0
 ...:       for i in xrange(len(string)):
 ...:           if string[i:i+3] == "abc" and string[i-1] != ".":
 ...:               tmp += 1
 ...:       return tmp > 0

In [2]: timeit abc_there("nghkabc")
Out[2]: 1000000 loops, best of 3: 310 ns per loop

In [3]: def abc_there(string):
...:        return string.count(".abc") != string.count("abc")

In [4]: timeit abc_there("nghkabc")
Out[4]: 1000000 loops, best of 3: 296 ns per loop
Run Code Online (Sandbox Code Playgroud)

296ns <310ns所以我的解决方案更快一点.

  • 好的,但是14亿分之一秒(4.5%)与OP的代码恕我直言相比并不是一个非常显着的改进. (2认同)