In [29]: re.findall("([abc])+","abc")
Out[29]: ['c']
In [30]: re.findall("[abc]+","abc")
Out[30]: ['abc']
被分组的人困惑。它有什么不同?
答案 0 :(得分:8)
这里需要解释两件事:量化组的行为,以及findall()
方法的设计。
在您的第一个示例中,[abc]
与{1}}匹配,a
在组#1中捕获。然后它匹配b
并在组#1中捕获它,覆盖a
。然后再次使用c
,以及比赛结束时组#1中剩下的内容。
但 匹配整个字符串。如果您使用的是search()
或finditer()
,则可以查看MatchObject,并看到group(0)
包含abc
而group(1)
包含c
}。但是findall()
返回字符串,而不是MatchObjects。如果没有组,则返回整体匹配的列表;如果有组,则列表包含所有捕获,但不整体匹配。
因此,你的两个正则表达式都匹配整个字符串,但第一个正在捕获并单独丢弃每个字符(这有点无意义)。只有findall()
的意外行为才会让您看起来感觉不一样。
答案 1 :(得分:7)
在第一个示例中,您有一个重复捕获的组,它只捕获最后一次迭代。这里c
。
([abc])+
在第二个示例中,您将匹配列表中的单个字符一次且无限次。
[abc]+
答案 2 :(得分:2)
这就是我想到的方式。 ([abc])+
正在尝试重复捕获的群组。当你使用" +"在捕获组之后,它并不意味着你将获得两个被捕获的组。最终发生的事情,至少对于Python的正则表达式和大多数实现来说,是" +"强制迭代,直到捕获组仅包含最后一个匹配。
如果要捕获重复的表达式,则需要反转"(...)"的排序。和" +",例如而不是([abc])+
使用([abc]+)
。
答案 3 :(得分:0)
输入" abc"
[abc]
匹配单个字符=> ""
[abc]+
+ 在一次和无限次之间,尽可能多次=> " ABC"
([abc])
捕获组([abc])=> ""
([abc])+
+ 重复捕获组仅捕获最后一次迭代=> " C"
答案 4 :(得分:-3)
分组只是给出了不同的偏好。
([abc])+
=>从选择中找到一个。可以匹配一个或多个。它找到一个和所有条件,因为+表示1或更多。这将正则表达式分为两个阶段。
虽然未分组的人被视为一个整体。