Python无限执行

won*_*bak 19 python regex

我正在尝试执行此代码:

import re
pattern = r"(\w+)\*([\w\s]+)*/$"
re_compiled = re.compile(pattern)
results = re_compiled.search('COPRO*HORIZON 2000                 HOR')
print(results.groups())
Run Code Online (Sandbox Code Playgroud)

但Python没有回应.该过程占用100%的CPU并且不会停止.我在Python 2.7.1和Python 3.2上都尝试过这种方法,结果相同.

Tim*_*ker 60

你的正则表达式会遇到灾难性的回溯,因为你有嵌套的量词(([...]+)*).由于你的正则表达式要求字符串结束/(在你的例子中失败),正则表达式引擎尝试字符串的所有排列,徒劳地希望找到匹配的组合.这就是卡住的地方.

为了说明,我们假设"A*BCD"您的正则表达式的输入,看看会发生什么:

  1. (\w+)比赛A.好.
  2. \*比赛*.好极了.
  3. [\w\s]+比赛BCD.好.
  4. /无法匹配(没有匹配的字符).好吧,让我们备份一个角色.
  5. /无法匹配D.哼.让我们再补充一些.
  6. [\w\s]+匹配BC,并重复[\w\s]+匹配D.
  7. /无法匹配.备份.
  8. /无法匹配D.备份更多.
  9. [\w\s]+匹配B,并重复[\w\s]+匹配CD.
  10. /无法匹配.再次备份.
  11. /无法匹配D.再补充一些.
  12. 如何[\w\s]+比赛B,多次[\w\s]+比赛C,反复[\w\s]+的比赛D?没有?我们试试别的吧.
  13. [\w\s]+比赛BC.让我们停在这里,看看会发生什么.
  14. Darn,/仍然不匹配D.
  15. [\w\s]+比赛B.
  16. 仍然没有运气./不匹配C.
  17. 嘿,整个小组都是可选的(...)*.
  18. 不,/仍然不匹配B.
  19. 好的,我放弃了.

那是一串只有三个字母的字符串.你的大约有30个,尝试所有的排列会让你的电脑忙碌直到几天结束.

我想你要做的是在之前/之后获取字符串*,在这种情况下,使用

pattern = r"(\w+)\*([\w\s]+)$"
Run Code Online (Sandbox Code Playgroud)