非暂停正则表达式(python re模块)

时间:2018-11-16 15:01:24

标签: python regex exit

在正则表达式match()操作(使用Python的re模块)中,什么会引起非停止行为?

我目前正在竭尽全力试图解决困扰我数小时的问题。为什么以下行挂起?

re.compile(r'.*?(now|with that|at this time|ready|stop|wrap( it|) up|at this point|happy|pleased|concludes|concluded|we will|like to)(,)*(( |\n)[a-z]+(\'[a-z]+)*,*){0,20}( |\n)(take|for|to|open|entertain|answer|address)(( |\n|)[a-z]+(\'[a-z]+)*,*){0,20}( |\n|)(questions|Q *& *A).*?', re.DOTALL| re.IGNORECASE).match("I would now like to turn the presentation over to your host for today's call, Mr. Mitch Feiger, please proceed.")

简而言之,我正在使用match(),正则表达式为r'.*?(now|with that|at this time|ready|stop|wrap( it|) up|at this point|happy|pleased|concludes|concluded|we will|like to)(,)*(( |\n)[a-z]+(\'[a-z]+)*,*){0,20}( |\n)(take|for|to|open|entertain|answer|address)(( |\n|)[a-z]+(\'[a-z]+)*,*){0,20}( |\n|)(questions|Q *& *A).*?'

文本为:"I would now like to turn the presentation over to your host for today's call, Mr. Mitch Feiger, please proceed."

我了解我的正则表达式有些混乱,它是随着时间的流逝而建立的,目的是为了使段落之间出现一些令人满意的匹配,而发言者则宣布问题会话的开始。我目前的主要困惑是试图查找其中可能导致我认为是非暂停搜索的内容。

它卡在了我的程序使用的许多其他文本上,但是距离它们还很远(该程序处理成千上万个文本文件,每个文本文件都需要匹配其中的约100个文本),并且我看不到任何共同因素。需要明确的是,应该返回匹配项,但是确实需要进行此检查,而且我不明白为什么它会像这样挂起。

更笼统地说,什么会导致Python正则表达式匹配无限期挂起?我很想获得信息,以便自己解决问题,但在这一点上,我会选择一个廉价的答案...

1 个答案:

答案 0 :(得分:0)

Python的re模块使用的

与Perl兼容的正则表达式(PCRE)在计算机科学意义上不再是“正则”的。因此,他们可能会遭受灾难性的回溯:https://swtch.com/~rsc/regexp/regexp1.html

这对您解决问题没有太大帮助。可以帮助您的是:

  1. 将您的正则表达式分解为多个小块
  2. 查看每个块执行所需的时间
  3. 开始将这些块放在一起以更接近您最初的巨大正则表达式

您可能不得不停止尝试使用1个单个regexp进行所有操作,并且可能使用1或2和一些代码将这2个部分更有效地组合在一起。