[英]difference between two regular expressions: [abc]+ and ([abc])+
In [29]: re.findall("([abc])+","abc")
Out[29]: ['c']
In [30]: re.findall("[abc]+","abc")
Out[30]: ['abc']
迷惑了。 它有什么不同?
这里有两件事需要解释:量化组的行为以及findall()
方法的设计。
在第一个示例中, [abc]
与a
匹配,该a
在组#1中捕获。 然后,它匹配b
并将其捕获到组#1中,覆盖a
。 然后再次使用c
,那就是比赛结束时第一组的比赛。
但是它确实匹配整个字符串。 如果您正在使用search()
或finditer()
,则可以查看MatchObject并看到group(0)
包含abc
而group(1)
包含c
。 但是findall()
返回字符串,而不是MatchObjects。 如果没有组,则返回所有匹配项的列表;否则,返回所有匹配项的列表。 如果有组,则列表包含所有捕获,但不包含整体匹配。
因此,您的两个正则表达式都与整个字符串匹配,但是第一个正则表达式也分别捕获并丢弃了每个字符(这毫无意义)。 仅仅是findall()
的意外行为,使它看起来像在获得不同的结果。
在第一个示例中,您有一个重复捕获的组,仅捕获最后一个迭代。 在这里c
。
([abc])+
在第二个示例中,您将匹配列表中的一个字符且无限制次数。
[abc]+
这是我考虑的方式。 ([abc])+
试图重复捕获的组。 当您在捕获组之后使用“ +”时,并不意味着您将获得两个捕获组。 至少对于Python的正则表达式和大多数实现而言,最终发生的事情是,“ +”强制迭代直到捕获组仅包含最后一个匹配项为止。
如果要捕获重复的表达式,则需要颠倒“(...)”和“ +”的顺序,例如,代替([abc])+
使用([abc]+)
。
输入“ abc”
[abc]
匹配单个字符=>“ a”
[abc]+
+一次至无限次,次数尽可能多=>“ abc”
([abc])
捕获组([abc])=>“ a”
([abc])+
+重复的捕获组将仅捕获上一次迭代=>“ c”
分组只是赋予了不同的偏好。
([abc])+
=>从选择中找到一个。 可以匹配一个或多个。 它找到一个且所有条件都满足,而+表示1或更大。 这将正则表达式分为两个阶段。
而未分组的被视为一个整体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.