Python重新无限执行
我正在尝试执行以下代码:Python重新无限执行,python,regex,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()) 但是Python没有响应。该进程占用100%的CPU,不会停止。我在Python2.7.1和Python3.2上都尝试过这个方法
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,不会停止。我在Python2.7.1和Python3.2上都尝试过这个方法,结果相同。您的正则表达式遇到了错误,因为您有嵌套的量词(([…])+)*
)。由于您的正则表达式要求字符串以/
结尾(在您的示例中失败),因此正则表达式引擎尝试字符串的所有排列,但徒劳地希望找到匹配的组合。这就是它被卡住的地方
为了举例说明,让我们假设“A*BCD”
作为正则表达式的输入,看看会发生什么:
(\w+)
匹配A
。好\*
匹配*
。耶[\w\s]+
匹配BCD
。嗯/
无法匹配(没有要匹配的字符)。好的,让我们备份一个角色/
无法匹配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
。让我们停下来看看会发生什么/
仍然与D
不匹配[\w\s]+
匹配B
C
不匹配(…)*
/
仍然与B
不匹配*
之前/之后获取字符串,在这种情况下,使用
pattern = r"(\w+)\*([\w\s]+)$"
看起来可能是你的模式。我不确定您想用表达式中的最后一个“*”做什么。以下代码似乎适合我:
import re
pattern = r"(\w+)\*([\w\s]+)$"
re_compiled = re.compile(pattern)
results = re_compiled.search('COPRO*HORIZON 2000 HOR')
print(results.groups())
有趣的是,Perl运行得非常快
-> perl -e 'print "Match\n" if "COPRO*HORIZON 2000 HOR" =~ m|(\w+)\*([\w\s]+)*/$|'
-> perl -e 'print "Match\n" if "COPRO*HORIZON 2000 HOR/" =~ m|(\w+)\*([\w\s]+)*/$|'
Match
Try或任何其他基于自动机理论的正则表达式引擎。当前pythonre模块中的一个是一个简单而缓慢的回溯引擎(目前,将来可能会发生变化)。但是基于自动机的引擎有一些限制,例如,它不允许使用反向引用。与此对照,找出它是否满足您的需要。是的,Perl包含许多优化,这些优化可以补偿正则表达式作者经常犯的错误。此外,当回溯数超过某个预定义值时,Perl停止执行正则表达式。@ovgolovin这几乎完全不正确。正则表达式引擎中有一个递归深度限制,在某些特殊情况下适用,但一般来说回溯没有限制。在这种情况下,Perl不会(可能错误地)报告失败的匹配;它打印了一个错误。@Alanmore在本例中,这是一个优化,即使对于许多编写良好的正则表达式也是有利可图的;正则表达式中出现的固定字符串也必须出现在候选字符串中,否则该字符串可能无法匹配。锚定的固定弦检查起来非常便宜;这基本上只是一个
strncmp
。我也遇到了同样的问题——等待了2分钟多的换人才结束。最后,安装了包regex
-效果很好-替换立即完成。您可以从此处安装: