2024-09-30 18:28:44 发布
网友
有人能解释一下为什么返回“cc”吗?在
>>> re.match('(..)+', 'aabbcc').group(1) 'cc'
有人告诉我,因为它把每一场比赛分到第(1)组,所以最后一场比赛是'cc'。是真的吗?在
那下面怎么解释呢?在
(..)定义的组是组1。+量词重复它。每次引擎能够重复组(匹配两个字符),组1就会被覆盖。在
(..)
+
aa
bb
cc
检查组1时,引擎返回cc。所有其他捕获都将丢失。在
(一个例外是.NET引擎,它也返回cc,但由于CaptureCollection对象,它还允许您检查中间捕获。它将包含aa、bb和{}。)
对于(..)+(...),组1为什么包含aa?回溯!
(..)+(...)
要理解这一点,我们需要再次遵循正则表达式引擎的路径。在
(...)
..
(..)+
bbc
参考
重复捕获组:组号保持不变
(..)
定义的组是组1。+
量词重复它。每次引擎能够重复组(匹配两个字符),组1就会被覆盖。在aa
捕获到组1bb
捕捉到第1组cc
捕获到组1。在检查组1时,引擎返回
cc
。所有其他捕获都将丢失。在(一个例外是.NET引擎,它也返回}。)
cc
,但由于CaptureCollection对象,它还允许您检查中间捕获。它将包含aa
、bb
和{对于
(..)+(...)
,组1为什么包含aa
?回溯!要理解这一点,我们需要再次遵循正则表达式引擎的路径。在
aa
捕捉到组1(..)
组并将bb
捕获到组1(..)
组并将cc
捕获到组1(...)
。它失败了:没有剩余的字符可供使用。在+
表示一次或多次,我们匹配了..
三次,所以我们可以放弃一次,甚至两次。在这个阶段,引擎放弃量化的(..)+
组的最后一个匹配,即cc
。我们回到了第一组是bb
的时候。在(...)
。只剩下两个字符:cc
,所以它又失败了。在(..)+
组的最后一个匹配,即bb
,来回溯。在这个阶段,第1组又是aa
。在(...)
。它成功了:组2是bbc
,组1是aa
参考
相关问题 更多 >
编程相关推荐