为什么这些正则表达式之间的速度存在巨大差异?

时间:2014-09-06 00:20:28

标签: regex python-2.7 performance

我正在努力从文件中提取几千行代码中的特定信息片段。我原来的正则表达式是:

re.findall('#+\s+Athstats\s+Radio\s+(\d+).+?(\d+)\s+nodes\s+allocated\(nodealloc\)\s+ (\d+)\s+nodes\s+deleted\(nodefree\)', source_string, re.DOTALL)

我把它改成了这些:

re.findall('#+\s*Athstats\s*Radio\s*(\d).*?#+.*?(\d+)\s*nodes\s*allocated\(nodealloc\)', source_string, re.DOTALL)
re.findall('#+\s*Athstats\s*Radio\s*(\d).*?#+.*?(\d+)\s*nodes\s*deleted\(nodefree\)', source_string, re.DOTALL)
事情慢慢变成了爬行......这需要几秒钟而不是微秒/秒!为什么是这样?我正在使用Python 2.7查看文本文件,其中包含几千行文本。

1 个答案:

答案 0 :(得分:0)

即使它是敏感信息,也不是真正的问题,发布样本很容易,您可以更改数据并保持相同的结构。在没有看到任何数据的情况下,我所能注意到的是:.*?#+.*?可能导致灾难性的回溯。但是没有数据样本,我找不到有效的替代方案。 - Casimir et Hippolyte

...有关完整的讨论,包括足够的信息,以了解哪些正则表达式将使用Python的实现表现不佳,请参阅Jeffrey Friedl的Mastering Regular Expressions。第一版专门讨论了Python的实现;第二个没有;我不确定第三个。 - 查尔斯达菲