Regex 为什么这些正则表达式在速度上存在巨大差异?

Regex 为什么这些正则表达式在速度上存在巨大差异?,regex,python-2.7,performance,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).*?#+

我正在从一个文件中提取一个特定的信息片段,有几千行代码。我最初的正则表达式是:

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浏览一个包含数千行文本的文本文件。

即使是敏感信息,也不是什么问题,发布示例很容易,您可以更改数据并保持相同的结构。在没有看到任何数据的情况下,我所能注意到的是:
*?#+.*?
,这可能会导致灾难性的回溯。但没有数据样本,我无法找到有效的替代方案卡西米尔和希波莱特


…有关包含足够信息的完整讨论,以了解使用Python实现哪些正则表达式会和哪些正则表达式不会表现良好,请参阅Jeffrey Friedl的《掌握正则表达式》。第一版专门讨论了Python的实现;第二个没有;我不确定第三个是什么Charles Duffy

无界字符集上的无界长度匹配是危险的。我强烈建议不要这样做——特别是因为在实践中,任何单一匹配中涉及的信息都应该非常接近。它搜索的信息可以是任何字符,因此无界字符是有意义的。这些单独的信息大约相隔10-50行。请您发布一份您输入数据的代表性样本,好吗?(特别是行首和行尾要准确)。这是一个敏感的信息,所以我不能发布它。我只是想知道正则表达式本身是否有什么东西会导致速度减慢。它们非常相似,速度差异之大令人惊讶。即使是敏感信息,也不是什么问题,发布样本很容易,您可以更改数据并保持相同的结构。在没有看到任何数据的情况下,我所能注意到的是:
*?#+.*?
,这可能会导致灾难性的回溯。但没有数据样本,我无法找到有效的替代方案。