我正在尝试执行这段代码:
import re
pattern = r"(\w+)\*([\w\s]+)*/$"
re_compiled = re.compile(pattern)
results = re_compiled.search('COPRO*HORIZON 2000 HOR')
print(results.groups())
但Python没有回应。该进程占用 100% 的 CPU 并且不会停止。我已经在 Python 2.7.1 和 Python 3.2 上尝试过,结果相同。
你的正则表达式遇到灾难性的回溯 http://www.regular-expressions.info/catastrophic.html因为你有嵌套量词(([...]+)*
)。由于您的正则表达式要求字符串以结尾/
(在您的示例中失败),正则表达式引擎尝试字符串的所有排列,徒劳地希望找到匹配的组合。这就是它被卡住的地方。
为了说明这一点,我们假设"A*BCD"
作为正则表达式的输入,看看会发生什么:
-
(\w+)
火柴A
. Good.
-
\*
火柴*
. Yay.
-
[\w\s]+
火柴BCD
. OK.
-
/
无法匹配(没有剩余字符可匹配)。好的,让我们备份一个角色。
-
/
无法匹配D
。哼。让我们再备份一些。
-
[\w\s]+
火柴BC
,以及重复的[\w\s]+
火柴D
.
-
/
无法匹配。备份。
-
/
无法匹配D
。再备份一些。
-
[\w\s]+
火柴B
,以及重复的[\w\s]+
火柴CD
.
-
/
无法匹配。再次备份。
-
/
无法匹配D
。再备份一些。
- 怎么样
[\w\s]+
火柴B
, 重复[\w\s]+
火柴C
, 重复[\w\s]+
火柴D
?不?让我们尝试一些别的东西。
-
[\w\s]+
火柴BC
。让我们在这里停下来看看会发生什么。
- Darn,
/
仍然不匹配D
.
-
[\w\s]+
火柴B
.
- 还是没有运气。
/
不匹配C
.
- 嘿嘿,全团可选
(...)*
.
- Nope,
/
仍然不匹配B
.
- 好吧,我放弃了。
现在那是一串只有三个字母的字符串。你的大约有 30 个,尝试其中的所有排列将使你的计算机一直忙碌到最后几天。
我想你想做的是获取之前/之后的字符串*
,在这种情况下,使用
pattern = r"(\w+)\*([\w\s]+)$"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)