繁体   English   中英

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

[英]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)包含abcgroup(1)包含c 但是findall()返回字符串,而不是MatchObjects。 如果没有组,则返回所有匹配项的列表;否则,返回所有匹配项的列表。 如果有组,则列表包含所有捕获,但包含整体匹配。

因此,您的两个正则表达式都与整个字符串匹配,但是第一个正则表达式也分别捕获并丢弃了每个字符(这毫无意义)。 仅仅是findall()的意外行为,使它看起来像在获得不同的结果。

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

([abc])+

正则表达式可视化

Debuggex演示

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

[abc]+

正则表达式可视化

Debuggex演示

这是我考虑的方式。 ([abc])+试图重复捕获的组。 当您在捕获组之后使用“ +”时,并不意味着您将获得两个捕获组。 至少对于Python的正则表达式和大多数实现而言,最终发生的事情是,“ +”强制迭代直到捕获组仅包含最后一个匹配项为止。

如果要捕获重复的表达式,则需要颠倒“(...)”和“ +”的顺序,例如,代替([abc])+使用([abc]+)

输入“ abc”

[abc]

匹配单个字符=>“ a”

[abc]+

+一次至无限次,次数尽可能多=>“ abc”

([abc])

捕获组([abc])=>“ a”

([abc])+

+重复的捕获组将仅捕获上一次迭代=>“ c”

分组只是赋予了不同的偏好。

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

而未分组的被视为一个整体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM