if all(char in mystr for char in "abc"):
# do something
检查速度:
>>> timeit.timeit(stmt='chars.issubset("bracket");chars.issubset("notinhere")',
... setup='chars=set("abc")')
1.3560583674019995
>>> timeit.timeit(stmt='all(char in "bracket" for char in s);all(char in "notinhere" for char in s)',
... setup='s="abc"')
1.4581878714681409
>>> timeit.timeit(stmt='r.match("bracket"); r.match("notinhere")',
... setup='import re; r=re.compile("(?=.*a)(?=.*b)(?=.*c)")')
1.0582279123082117
嘿,看,雷鬼赢了!这甚至适用于较长的搜索字符串:
>>> timeit.timeit(stmt='chars.issubset("bracketed");chars.issubset("notinhere")',
... setup='chars=set("abcde")')
1.4316702294817105
>>> timeit.timeit(stmt='all(char in "bracketed" for char in s);all(char in "notinhere" for char in s)',
... setup='s="abcde"')
1.6696223364866682
>>> timeit.timeit(stmt='r.match("bracketed"); r.match("notinhere")',
... setup='import re; r=re.compile("(?=.*a)(?=.*b)(?=.*c)(?=.*d)(?:.*e)")')
1.1809254199004044
% python -mtimeit -s'import test' "test.using_set('bracket')"
100000 loops, best of 3: 2.63 usec per loop
% python -mtimeit -s'import test' "test.using_lookahead('bracket')"
100000 loops, best of 3: 2.87 usec per loop
对于长字符串,regex显然更快:
比赛迟到时:
% python -mtimeit -s'import test' "test.using_set('o'*1000+'bracket')"
10000 loops, best of 3: 49.7 usec per loop
% python -mtimeit -s'import test' "test.using_lookahead('o'*1000+'bracket')"
100000 loops, best of 3: 6.66 usec per loop
当比赛提前到来时:
% python -mtimeit -s'import test' "test.using_set('bracket'+'o'*1000)"
10000 loops, best of 3: 50 usec per loop
% python -mtimeit -s'import test' "test.using_lookahead('bracket'+'o'*1000)"
100000 loops, best of 3: 13.9 usec per loop
(回答注释中的问题:)r'^(?=.*a)(?=.*b)(?=.*c)'可用于表示匹配:
In [40]: pat=re.compile(r'^(?=.*a)(?=.*b)(?=.*c)')
In [41]: pat.search('bracket')
Out[41]: <_sre.SRE_Match object at 0x9f9a6b0>
在Python中,我不会为此目的使用正则表达式,而是使用一个集合:
正则表达式很有用,但在某些情况下,不同的工具更合适。
这可以通过前瞻性断言来实现:
如果字符串至少包含一个
a
、b
和c
匹配。但正如你所看到的,这并不是正则表达式真正擅长的。
我会这么做的:
检查速度:
嘿,看,雷鬼赢了!这甚至适用于较长的搜索字符串:
这里是issubset与regex解的时间比较。
对于小字符串,
issubset
可能稍快:对于长字符串,regex显然更快:
比赛迟到时:
当比赛提前到来时:
(回答注释中的问题:)
r'^(?=.*a)(?=.*b)(?=.*c)'
可用于表示匹配:相关问题 更多 >
编程相关推荐