为什么重复捕获组会返回这些字符串?

时间:2014-07-21 02:40:42

标签: python regex

有人可以解释为什么以下返回'cc'?

>>> re.match('(..)+', 'aabbcc').group(1)
'cc'

我被告知因为它将每场比赛放入组(1),所以最后一场比赛是'cc'。这是真的吗?

然后如何解释以下?

>>> re.match('(..)+(...)', 'aabbcc').group(1)
'aa'

1 个答案:

答案 0 :(得分:5)

重复捕获组:组号保持相同

(..)定义的组是第1组。+量词重复它。每次引擎能够重复该组(匹配两个字符)时,组1都会被覆盖。

  • 当引擎开始匹配时,它会将aa捕获到第1组
  • 然后它会将bb捕获到第1组
  • 然后将cc捕获到第1组。

检查第1组时,引擎返回cc。所有其他捕获都丢失了。

(.NET引擎除外,它还返回cc,但也允许您通过CaptureCollection对象检查中间捕获。它将包含aabb和{ {1}}。)

cc,为什么第1组包含(..)+(...)?回溯!

要理解这一点,我们再次需要遵循正则表达式引擎的路径。

  • 再一次,当引擎开始匹配时,它会将aa捕获到第1组
  • 同样,它重复aa组并将(..)捕获到第1组
  • 同样,它重复bb组并将(..)捕获到第1组
  • 引擎现在尝试匹配cc。它失败了:没有任何字符可供使用。
  • 字符串和正则表达式模式中的引擎回溯(...)表示一次或多次,我们匹配+三次,因此我们可以给一个,甚至两个。在此阶段,引擎会放弃量化的..组的最后一场比赛,即(..)+。我们回到第1组cc
  • 引擎再次尝试匹配bb。只剩下两个字符:(...),因此它再次失败。
  • 引擎回溯,放弃量化cc组的最后一场比赛,即(..)+。在此阶段,第1组再次为bb
  • 引擎再次尝试匹配aa。它成功:第2组为(...),第1组为bbc

<强>参考