两个正则表达式之间的差异:[abc] +和([abc])+

时间:2016-02-28 02:11:46

标签: python regex

In [29]: re.findall("([abc])+","abc")
Out[29]: ['c']

In [30]: re.findall("[abc]+","abc")
Out[30]: ['abc']

被分组的人困惑。它有什么不同?

5 个答案:

答案 0 :(得分:8)

这里需要解释两件事:量化组的行为,以及findall()方法的设计。

在您的第一个示例中,[abc]与{1}}匹配,a在组#1中捕获。然后它匹配b并在组#1中捕获它,覆盖a。然后再次使用c,以及比赛结束时组#1中剩下的内容。

匹配整个字符串。如果您使用的是search()finditer(),则可以查看MatchObject,并看到group(0)包含abcgroup(1)包含c }。但是findall()返回字符串,而不是MatchObjects。如果没有组,则返回整体匹配的列表;如果有组,则列表包含所有捕获,但整体匹配。

因此,你的两个正则表达式都匹配整个字符串,但第一个正在捕获并单独丢弃每个字符(这有点无意义)。只有findall()的意外行为才会让您看起来感觉不一样。

答案 1 :(得分:7)

在第一个示例中,您有一个重复捕获的组,它只捕获最后一次迭代。这里c

([abc])+

Regular expression visualization

Debuggex Demo

在第二个示例中,您将匹配列表中的单个字符一次且无限次。

[abc]+

Regular expression visualization

Debuggex Demo

答案 2 :(得分:2)

这就是我想到的方式。 ([abc])+正在尝试重复捕获的群组。当你使用" +"在捕获组之后,它并不意味着你将获得两个被捕获的组。最终发生的事情,至少对于Python的正则表达式和大多数实现来说,是" +"强制迭代,直到捕获组仅包含最后一个匹配。

如果要捕获重复的表达式,则需要反转"(...)"的排序。和" +",例如而不是([abc])+使用([abc]+)

答案 3 :(得分:0)

输入" abc"

[abc]

匹配单个字符=> ""

[abc]+

+ 在一次和无限次之间,尽可能多次=> " ABC"

([abc])

捕获组([abc])=> ""

([abc])+

+ 重复捕获组仅捕获最后一次迭代=> " C"

答案 4 :(得分:-3)

分组只是给出了不同的偏好。

([abc])+ =>从选择中找到一个。可以匹配一个或多个。它找到一个和所有条件,因为+表示1或更多。这将正则表达式分为两个阶段。

虽然未分组的人被视为一个整体。