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就会被覆盖
- 当发动机开始匹配时,它将
捕获到组1aa
- 然后将
捕获到第1组bb
- 然后将
捕获到组1李>cc
cc
。所有其他捕获都将丢失
(例外是.NET引擎,它也返回cc
,但也允许您通过CaptureCollection对象检查中间捕获。它将包含aa
、bb
和cc
)
对于(…)+(…)
,为什么组1包含aa
?回溯强>
为了理解这一点,我们再次需要遵循正则表达式引擎的路径
- 再次,当发动机开始匹配时,它将
捕获到组1aa
- 同样,它重复
组并将(..)
捕获到组1bb
- 同样,它重复
组并将(..)
捕获到组1cc
- 引擎现在尝试匹配
。它失败了:没有可以使用的字符了(…)
- 引擎在字符串和正则表达式模式中回溯。
表示一次或多次,我们匹配了+
三次,所以我们可以放弃一次,甚至两次。在此阶段,引擎放弃量化。
组的最后一个匹配,即(..)+
。我们回到了第一组是bb的时候cc
- 引擎再次尝试匹配
。只剩下两个字符:(…)
,因此它再次失败李>cc
- 引擎通过放弃量化
组的最后一个匹配(即(..)+
)进行回溯。在这个阶段,第1组再次是bb
aa
- 引擎再次尝试匹配
。成功:第2组为bbc,第1组为aa(…)
(…)+(…)
情况下发动机内部构件的详细说明。另外,强烈建议您阅读“血淋淋的细节”文章链接:决定删除我的,不想写故事。@hwnd是的,理解它是如何工作的很有趣,但正如你所说,你必须写整个引擎故事。:)嘿,德清,我添加了很多细节,所以如果有任何不清楚的地方,请告诉我。:)