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

2024-04-26 10:53:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

被那群人搞糊涂了。这有什么区别?在


Tags: inreoutabc区别findall
3条回答

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

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

但它的与整个字符串匹配。如果您使用的是search()finditer(),那么您将能够查看MatchObject并看到{}包含{},而{}包含{}。但是findall()返回字符串,而不是MatchObjects。如果没有组,则返回总体匹配的列表;如果有组,则列表包含所有捕获,但不是整体匹配。在

所以两个正则表达式都匹配整个字符串,但第一个正则表达式也分别捕获和丢弃每个字符(这有点毫无意义)。只是findall()的意外行为让你看起来得到了不同的结果。在

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

([abc])+

Regular expression visualization

Debuggex Demo

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

^{pr2}$

Regular expression visualization

Debuggex Demo

我是这么想的。([abc])+正在尝试重复捕获的组。当你在捕获组后面使用“+”时,并不意味着你将得到两个捕获组。最终发生的事情是“+”强制迭代,直到捕获组只包含最后一个匹配项,至少对于Python的regex和大多数实现来说是这样。在

如果您想捕获一个重复的表达式,您需要颠倒“(…)”和“+”的顺序,例如,而不是([abc])+使用([abc]+)。在

相关问题 更多 >