为什么这个 Python 正则表达式会卡住?

2024-03-29 12:57:01 发布

您现在位置:Python中文网/ 问答频道 /正文

正则表达式:

^(\w+,?\s?)+(?=:): hi hey\?$

输入:

^{pr2}$

输出:挂起

代码

^{3}$

期望的行为:使用以下模式查找字符串

[comma_and_(optionally)space_separated_values][colon][question]

不应匹配的输入示例:

  • : qqq?(无值)
  • aa: qqq?(只有一个值)
  • aa, bb: qqq(没有问题)
  • aa, : qqq?(错误值格式)
  • aa, bb, cc:?(毫无疑问)
  • , bb, cc: qqq?(错误的值格式)

应匹配的输入示例:

  • aa, bb: qq?
  • aa, b, c,d,e,f, g, h: qq?
  • aa, bb, cc: qq ee ff gggg hhhh?

Tags: 字符串代码示例格式错误模式hiaa
1条回答
网友
1楼 · 发布于 2024-03-29 12:57:01

由于这种(\w+)+方案,它挂起。
一、 e.故障时太复杂
如果匹配,效果很好,失败时会爆炸。在

(\w,?\s?)+(\w+,?\s?)+相同,但不会挂起。在

所以,把它改成这个^(\w,?\s?)+(?=:): hi hey\?$,问题就解决了。在

作为奖励,这个^(\w,?\s?)+: hi hey\?$是相同的。在

另外,您可以用.*?\?$代替文本hi hey\?$
如果应为变量文本。在


Error: Target Operation .. 

The complexity of matching the regular 
expression exceeded predefined bounds.  
Try refactoring the regular expression 
to make each choice made by the state 
machine unambiguous.  This exception is 
thrown to prevent "eternal" matches that
take an indefinite period time to 
locate.

编辑:

注意总是嵌套量词的潜在问题总是
一、 那些贪婪的和开放的,比如(b+*。在

这几乎可以通过移除内部嵌套(如示例中的b+)来解决。
通过不量化,我们可以称之为伪锚。在

也就是说,它应该是组中第一个,并且是一个未量化的、必需的特征。在

这将迫使回溯上的引擎再次转到字符进行检查。
如果不量化,它会立即放弃,甚至不看
表达式的其余部分。
因此,它会越过字符串中的那个位置来找到next文本b。在

这就是回溯治疗的基本原理。在

考虑到回溯的缺陷,我们可以制定一个解决方案来获得所需的匹配。在

^\s*(\w+\s*(?:[,\s]\s*\w+\s*)+)\s*:\s*([^:]*?\w[^:]*?)\s*\?\s*$

Formatted

^{pr2}$

相关问题 更多 >