我想知道是否有更好/更好/更快的方法来解决以下问题.
如果给定字符串包含"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" - >是的
只有句点右侧的实例才会被删除.
正则表达式是完成此操作的完美工具:
>>> 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)
有一种不那么直截了当的方法可以解决这个问题,而且速度也稍快一些.我的代码:
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所以我的解决方案更快一点.