我正在使用python3
。
我有一条规则:(re.compile(r'a b', re.IGNORECASE), "A")
后来我发现'a c'
也应该匹配。
添加此规则的哪种方式更有效?
(re.compile(r'a (b|c)', re.IGNORECASE), "A")
或只是添加其他规则
(re.compile(r'a c', re.IGNORECASE), "A").
我做了'timeit',但没有显着差异。我想知道我的结论是否正确,背后的原因以及它是否适用于多案例,例如'a(b | c | d | e)'和三个额外的规则。
答案 0 :(得分:0)
由于正则表达式在线性时间(w.r.t。与输入单词)匹配,我相信拥有一个(更复杂的)正则表达式比许多不同(更小)的正则表达式更有效。
快速而肮脏的测试:
1.62659708800129
5.003811294998741
这导致(在在线REPL中执行):
LoadModule rewrite_module modules/mod_rewrite.so
所以看来我错了;-)
答案 1 :(得分:0)
没有一般答案,性能结果很大程度上取决于所使用的正则表达式引擎/风格。例如,已知Perl对regex alternatives非常敏感,例如见Why does adding one more alternative make my regex over 600 times slower?
Python的re模块并不是最快的(根本不是),但performance comparisons suggest它受正则表达式备选方案的影响较小。
另一方面,似乎python的性能受到更多Catastrophic Backtracking from Runaway Regular Expressions的影响。
例如,x+
形式的模式在写为xx*
时效果更好。
一般情况下,建议使用占有量词,原子分组(参见上面的链接)和Capture Only When Necessary来改善正则表达式运行时。
因此,分别测试每个正则表达式比使用备用正则表达式要高效得多。