正则表达式的最坏情况分析

时间:2011-01-19 02:06:07

标签: python regex perl optimization analysis

是否有任何工具会采用特定的正则表达式,并根据正则表达式匹配的特定数量的字符所需的操作数返回最坏情况?

例如,给定一个(f|a)oo.*[ ]baz,引擎可能会通过多少步骤来匹配100个字符?

如果有一个工具可以获取大量文本样本并显示每次运行的平均操作,我也会感兴趣。

我意识到这将在很大程度上取决于所使用的引擎和实现 - 但我不知道这是多么常见。因此,如果它对于许多语言来说很常见(使我的问题太模糊),我会对Perl和Python特别感兴趣。

3 个答案:

答案 0 :(得分:22)

Regexbuddy's调试器显示引擎在给定样本上结束匹配与否的步数。有关catastrophic backtrackingdebugging regular expressions的更多信息。

catastrophic backtracking shown in RegexBuddy

PS:它不是免费的,但它们提供3个月的退款保证。

答案 1 :(得分:11)

请注意,它取决于引擎。虽然正则表达式理论基于直线自动机理论,但大多数引擎并不是那些理论的严格翻译。因此,例如,某些引擎会在指数时间内发生,而严格的NFA处理则不会。

答案 2 :(得分:7)

您可能会在re.compile使用re.DEBUG之类的内容。有关详细说明,请参阅excellent answer社区维基中的Python Hidden Features