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

标签 python regex

我正在使用 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

最佳答案

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

我建议以 '\s 成为必需的方式解包有问题的组,并将它们包装在可选组中:

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

参见 regex demo

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

模式的其余部分:

  • \s*[-~]\s* - -~ 用 0+ 个空格包裹
  • (\$?\d+(?:\.\d+)?\$?) - 第 2 组捕获
    • \$? - 1 或 0 个 $ 符号
    • \d+ - 1+ 位
    • (?:\.\d+)? - 1 或 0 个零序列:
      • \. - 一个点
      • \d+ - 1+ 位
    • \$? - 1 或 0 个 $ 符号

关于python - 为什么python的re.search方法挂了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43310667/

相关文章:

python - 如何替换我当前所在的行?

regex - 使用正则表达式解析HTML : why not?

c# - 如何重用正则表达式变量?

javascript - 使用 RegEx 匹配字符串列表

regex - 如何使用正则表达式拆分字符串

python - 正则表达式 - 查找每 n 个(固定)字符在另一个字符串中出现的字符串

python - 如何使用 numpy 对循环数组进行切片

python - 如何使用日志记录将日志发送到松弛作为 python 和 flask 中的消息?

python - 如何检查 Reddit 帖子是否仅包含图像而没有其他内容?

c# - 使预测文本算法运行得更快