Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python重新无限执行_Python_Regex - Fatal编程技术网

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
    不匹配
  • 好吧,我放弃
  • 现在这是一个只有三个字母的字符串。你的电脑大约有30个,尝试所有的排列方式会让你的电脑一直忙到最后

    我想您要做的是在
    *
    之前/之后获取字符串,在这种情况下,使用

    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
    -效果很好-替换立即完成。您可以从此处安装: