正则表达式运行时diff之间创建一个新规则并使用“|”,python

时间:2018-04-24 18:29:46

标签: python regex

我正在使用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)'和三个额外的规则。

2 个答案:

答案 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来改善正则表达式运行时。

因此,分别测试每个正则表达式比使用备用正则表达式要高效得多。