首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式-相同匹配的不同字符串

正则表达式-相同匹配的不同字符串
EN

Stack Overflow用户
提问于 2018-02-06 16:30:21
回答 2查看 328关注 0票数 8

我知道模式r'([a-z]+)\1+'在搜索字符串中搜索重复的多字符模式,但我不明白为什么k2答案不是'aaaaa‘(5 'a'):

代码语言:javascript
复制
import re
k1 = re.search(r'([a-z]+)\1+', 'aaaa')
k2 = re.search(r'([a-z]+)\1+', 'aaaaa')
k3 = re.search(r'([a-z]+)\1+', 'aaaaaa')
print(k1)  # <_sre.SRE_Match object; span=(0, 4), match='aaaa'>
print(k2)  # <_sre.SRE_Match object; span=(0, 4), match='aaaa'>
print(k3)  # <_sre.SRE_Match object; span=(0, 6), match='aaaaaa'>

Python 3.6.1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-06 23:08:42

这里的关键概念是回溯。每当模式包含不同长度的量化子模式时,正则表达式引擎可以以各种方式匹配字符串,一旦在量化部分之后的正则表达式的一部分不能匹配某些子字符串,它就可以回溯,即释放属于量化模式的字符,并尝试与随后的子模式匹配。

看一看更大的情况:

让我们看看短字符串在跳转更长的例子之前是如何匹配的.

那么,为什么a不匹配呢?因为必须至少有两个字符,因为[a-z]+\1+需要匹配至少一个字符。

aa是匹配的,因为第一个([a-z]+)首先匹配整个字符串,然后回溯以适应\1+模式的一些文本(并且它匹配第二个a),所以有一个匹配。

3-a字符串aaa匹配为一个整体,因为第一个([a-z]+)首先匹配整个字符串,然后回溯以适应\1+模式的一些文本(注意,捕获组必须只保存一个a,因为当尝试使用两个aa时,\1+无法匹配最后的第三个a),并且有三个a的匹配。

现在来看看问题中的例子

aaaa字符串匹配的整体类似于aa匹配的方式:捕获组模式首先捕获整个aaaa,然后回溯,因为\1+也必须“查找”一些文本,而regex引擎试图将aaa捕获到第1组。然而,\1+无法匹配3a,因此回溯会继续进行,当第1组中有两个a时,量化的回引用将匹配最后两个a

case:

aaaaa字符串匹配如下:

  • aaaaa被抓取并与([a-z]+)部件一起放入第1组
  • \1+找不到任何文本,引擎重新尝试将字符串与\1+可以匹配不同文本之前的字符串进行不同的匹配,这要归功于+量词。
  • 尝试aaaa (=放置到第1组),但没有效果,因为\1+不匹配(就像\1尝试匹配aaaa一样,但在字符串结束之前只剩下a )。
  • 再次尝试aaa无效(因为\1试图匹配aaa,但只剩下两个a)
  • aa被放入第1组,\1匹配第三和第四个a,这是唯一的匹配,因为字符串中只保留了一个a

这是一个字符串匹配方式的示例方案

最后一个a无法匹配:

票数 2
EN

Stack Overflow用户

发布于 2018-02-06 16:34:49

因为他很贪婪。

所发生的是([a-z]+)首先匹配'aaaaa',然后返回到\1+匹配字符串为止,然后停止。因为'aa‘是([a-z]+)的第一个值,它将使\1成功匹配,这就是它返回的内容。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48647645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档