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