这是我检查 mystring
是否以某个字符串开头的方法:
>>> mystring.lower().startswith("he")
True
问题是 mystring
很长(几千个字符),所以 lower()
操作需要很多时间。
问题:有没有更有效的方法?
我的失败尝试:
>>> import re;
>>> mystring.startswith("he", re.I)
False
最佳答案
你可以使用如下的正则表达式:
In [33]: bool(re.match('he', 'Hello', re.I))
Out[33]: True
In [34]: bool(re.match('el', 'Hello', re.I))
Out[34]: False
在 2000 个字符的字符串上,这比 lower()
快大约 20 倍:
In [38]: s = 'A' * 2000
In [39]: %timeit s.lower().startswith('he')
10000 loops, best of 3: 41.3 us per loop
In [40]: %timeit bool(re.match('el', s, re.I))
100000 loops, best of 3: 2.06 us per loop
如果你重复匹配同一个前缀,预编译正则表达式会有很大的不同:
In [41]: p = re.compile('he', re.I)
In [42]: %timeit p.match(s)
1000000 loops, best of 3: 351 ns per loop
对于短前缀,在将其转换为小写之前从字符串中切出前缀可能会更快:
In [43]: %timeit s[:2].lower() == 'he'
1000000 loops, best of 3: 287 ns per loop
这些方法的相对时间当然取决于前缀的长度。在我的机器上,盈亏平衡点似乎大约是六个字符,这是预编译正则表达式成为最快方法的时候。
在我的实验中,单独检查每个字符可能会更快:
In [44]: %timeit (s[0] == 'h' or s[0] == 'H') and (s[1] == 'e' or s[1] == 'E')
1000000 loops, best of 3: 189 ns per loop
但是,此方法仅适用于您编写代码时已知的前缀,不适用于更长的前缀。
关于python - Python 中不区分大小写的字符串以开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13578916/