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

2024-09-30 18:28:44 发布

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

有人能解释一下为什么返回“cc”吗?在

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

有人告诉我,因为它把每一场比赛分到第(1)组,所以最后一场比赛是'cc'。是真的吗?在

那下面怎么解释呢?在

^{2}$

Tags: rematchgroupccaabbcc
1条回答
网友
1楼 · 发布于 2024-09-30 18:28:44

重复捕获组:组号保持不变

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

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

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

(一个例外是.NET引擎,它也返回cc,但由于CaptureCollection对象,它还允许您检查中间捕获。它将包含aabb和{}。)

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

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

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

参考

相关问题 更多 >