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

Python 为什么重复捕获组返回这些字符串?,python,regex,Python,Regex,有人能解释一下为什么会出现“抄送”现象吗 >>> re.match('(..)+', 'aabbcc').group(1) 'cc' 我被告知,因为它把每一场比赛分为第(1)组,所以最后一场比赛是“cc”。这是真的吗 那么如何解释以下内容 >>> re.match('(..)+(...)', 'aabbcc').group(1) 'aa' 重复捕获组:组号保持不变 (..)定义的组是组1。+量词重复它。每次引擎能够重复组(匹配两个字符),组1就会被覆盖

有人能解释一下为什么会出现“抄送”现象吗

>>> re.match('(..)+', 'aabbcc').group(1)
'cc'
我被告知,因为它把每一场比赛分为第(1)组,所以最后一场比赛是“cc”。这是真的吗

那么如何解释以下内容

>>> re.match('(..)+(...)', 'aabbcc').group(1)
'aa'
重复捕获组:组号保持不变
(..)
定义的组是组1。
+
量词重复它。每次引擎能够重复组(匹配两个字符),组1就会被覆盖

  • 当发动机开始匹配时,它将
    aa
    捕获到组1
  • 然后将
    bb
    捕获到第1组
  • 然后将
    cc
    捕获到组1
检查组1时,发动机返回
cc
。所有其他捕获都将丢失

(例外是.NET引擎,它也返回
cc
,但也允许您通过CaptureCollection对象检查中间捕获。它将包含
aa
bb
cc

对于
(…)+(…)
,为什么组1包含
aa
?回溯

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

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


FYI添加了
(…)+(…)
情况下发动机内部构件的详细说明。另外,强烈建议您阅读“血淋淋的细节”文章链接:决定删除我的,不想写故事。@hwnd是的,理解它是如何工作的很有趣,但正如你所说,你必须写整个引擎故事。:)嘿,德清,我添加了很多细节,所以如果有任何不清楚的地方,请告诉我。:)