繁体   English   中英

正则表达式匹配(\\ w +)以捕获由|||分隔的单个单词 - Python

[英]Regex match (\w+) to capture single words delimited by ||| - Python

我试图匹配,如果有单词后跟\\s|||\\s然后另一个单词后跟\\s|||\\s所以我正在使用这个正则表达式:

single_word_regex = r'(\w+)+\s\|\|\|\s(\w+)\s\|\|\|\s.*'

当我试图匹配这个字符串时,正则表达式匹配挂起或需要几分钟(可能会进入某种“深度循环”)

>>> import re
>>> import time
>>> single_word_regex = r'(\w+)+\s\|\|\|\s(\w+)\s\|\|\|\s.*'        
>>> x = u'amornratchatchawansawangwong ||| amornratchatchawansawangwong . ||| 0.594819 0.5 0.594819 0.25 ||| 0-0 0-1 ||| 1 1 1 ||| |||'
>>> z = u'amor 我 ||| amor . i ||| 0.594819 0.0585231 0.594819 0.0489472 ||| 0-0 0-1 1-2 ||| 2 2 2 ||| |||'
>>> y = u'amor ||| amor ||| 0.396546 0.0833347 0.29741 0.08 ||| 0-0 0-1 ||| 3 4 2 ||| |||'
>>> re.match(single_word_regex, z, re.U)                                              
>>> re.match(single_word_regex, y, re.U)                                          
<_sre.SRE_Match object at 0x105b879c0>
>>> start = time.time(); re.match(single_word_regex, y, re.U); print time.time() - start
9.60826873779e-05
>>> start = time.time(); re.match(single_word_regex, x, re.U); print time.time() - start # It hangs...

为什么要花那么长时间?

是否有更好/更简单的正则表达式来捕获这个条件len(x.split(' ||| ')[0].split()) == 1 == len(x.split(' ||| ').split())

请注意, r'(\\w+)+'模式本身不会导致灾难性的回溯 ,它只会在较长的表达式中“邪恶”,特别是当它被放置在模式的开头旁边时,以防万一子模式使引擎无法回溯到这个,并且内部的1+量词再次用+量化,这会产生大量可能的变化,以便在失败之前尝试。 您可以查看正则表达式演示并单击左侧的正则表达式调试器以查看示例正则表达式引擎行为。

当前的正则表达式可以写成

r'^(\w+)\s\|{3}\s(\w+)\s\|{3}\s(.*)'

如果删除空格,请参阅正则表达式演示 ,其中将匹配. 在第二个领域。

细节

  • ^ - 字符串的开头( re.match
  • (\\w+) - (组1)1+字母/数字/下划线
  • \\s - 一个空白
  • \\|{3} - 3个管道符号
  • \\s(\\w+)\\s\\|{3}\\s - 见上文( (\\w+)创建组2)
  • (.*) - (第3组)除了换行符之外的任何0+字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM