为什么python的re.search方法挂起?

2023-11-22

我正在使用 python 正则表达式库来解析一些字符串,目前我发现我的正则表达式要么太复杂,要么我正在搜索的字符串太长。

这是挂断的示例:

>>> import re
>>> reg = "(\w+'?\s*)+[-|~]\s*((\d+\.?\d+\$?)|(\$?\d+\.?\d+))"
>>> re.search(reg, "**LOOKING FOR PAYPAL OFFERS ON THESE PAINTED UNCOMMONS**") #Hangs here...

我不确定发生了什么事。任何帮助表示赞赏!

编辑:这是一个链接,其中包含我试图匹配的示例:Regxr


代码执行挂起的原因是灾难性的回溯由于量化组内有一个强制性模式和 1 个以上可选模式(可以匹配空字符串的模式)(\w+'?\s*)+这允许正则表达式引擎测试大量匹配路径,数量太多以至于需要很长时间才能完成。

我建议以这样的方式解开有问题的群体:' or \s成为强制性的并将它们包装在可选组中:

(\w+(?:['\s]+\w+)*)\s*[-~]\s*(\$?\d+(?:\.\d+)?\$?)
^^^^^^^^^^^^^^^^^^^***

See the 正则表达式演示

Here, (\w+(?:['\s]+\w+)*)将匹配 1+ 个单词字符,然后匹配 0+ 个 1+ 的序列'或空格后跟 1 个以上单词字符。这样,模式就变成线性的,并且如果出现不匹配的字符串,正则表达式引擎会更快地失败。

其余的模式:

  • \s*[-~]\s*- 任何一个- or ~用 0+ 空格包裹
  • (\$?\d+(?:\.\d+)?\$?) - Group 2 capturing
    • \$?- 1 或 0$ symbols
    • \d+- 1+ 位数字
    • (?:\.\d+)? - 1 or 0 zero sequences of:
      • \. - a dot
      • \d+- 1+ 位数字
    • \$?- 1 或 0$ symbols
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么python的re.search方法挂起? 的相关文章

随机推荐