In [29]: re.findall("([abc])+","abc")
Out[29]: ['c']
In [30]: re.findall("[abc]+","abc")
Out[30]: ['abc']
被分组的人搞糊涂了。它有何不同?
最佳答案
这里有两点需要说明:量化组的行为,以及findall()
方法的设计。
在您的第一个示例中,[abc]
匹配在第 1 组中捕获的 a
。然后它匹配 b
并在组 #1 中捕获它,覆盖 a
。然后再次使用 c
,这就是比赛结束时留在第 1 组中的内容。
但它确实匹配整个字符串。如果您使用的是 search()
或 finditer()
,您将能够查看 MatchObject 并看到 group(0)
包含abc
和 group(1)
包含 c
。但是 findall()
返回字符串,而不是 MatchObjects。如果没有组,则返回整体匹配列表;如果有组,则列表包含所有捕获,但不是整体匹配。
所以您的两个正则表达式都匹配整个字符串,但第一个正则表达式还单独捕获和丢弃每个字符(这有点毫无意义)。只是 findall()
的意外行为让您看起来得到了不同的结果。
关于python - 两个正则表达式之间的区别 : [abc]+ and ([abc])+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677905/