python - Python 中不区分大小写的字符串以开头

标签 python string performance case-insensitive startswith

这是我检查 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/

相关文章:

c - 如何在 C 中将 char 指针转换为 float?

c++ - 库,有助于打包具有良好性能的结构

Angular 4 - Angular 与 --prod 捆绑在一起要快多少

javascript - @async 脚本会在解析器遇到其标签之前运行吗?

python - 在 python 中的 excel 列中进行反向计算

javascript - 在javascript中将值转换为bytearray

python - mysql编辑器select查询和python程序select查询结果的区别

python - fatal error : 'mymodule.h' file not found - Cython compile fails to find header

javascript - 尝试在 p5.js 中调用多行字符串时出现 TypeError

javascript - 用掩码替换每个逗号