2024-04-26 10:53:57 发布
网友
In [29]: re.findall("([abc])+","abc") Out[29]: ['c'] In [30]: re.findall("[abc]+","abc") Out[30]: ['abc']
被那群人搞糊涂了。这有什么区别?在
这里需要解释两件事:量化组的行为和findall()方法的设计。在
findall()
在第一个例子中,[abc]匹配a,这是在组1中捕获的。然后它匹配b,并在组1中捕获它,覆盖{}。然后再次使用c,这就是比赛结束时第1组中剩下的内容。在
[abc]
a
b
c
但它的与整个字符串匹配。如果您使用的是search()或finditer(),那么您将能够查看MatchObject并看到{}包含{},而{}包含{}。但是findall()返回字符串,而不是MatchObjects。如果没有组,则返回总体匹配的列表;如果有组,则列表包含所有捕获,但不是整体匹配。在
search()
finditer()
所以两个正则表达式都匹配整个字符串,但第一个正则表达式也分别捕获和丢弃每个字符(这有点毫无意义)。只是findall()的意外行为让你看起来得到了不同的结果。在
在第一个示例中,您有一个只捕获最后一次迭代的重复捕获组。这里c。在
([abc])+
Debuggex Demo
在第二个示例中,您将匹配列表中的单个字符,并且不限次数。在
我是这么想的。([abc])+正在尝试重复捕获的组。当你在捕获组后面使用“+”时,并不意味着你将得到两个捕获组。最终发生的事情是“+”强制迭代,直到捕获组只包含最后一个匹配项,至少对于Python的regex和大多数实现来说是这样。在
如果您想捕获一个重复的表达式,您需要颠倒“(…)”和“+”的顺序,例如,而不是([abc])+使用([abc]+)。在
([abc]+)
这里需要解释两件事:量化组的行为和
findall()
方法的设计。在在第一个例子中,}。然后再次使用
[abc]
匹配a
,这是在组1中捕获的。然后它匹配b
,并在组1中捕获它,覆盖{c
,这就是比赛结束时第1组中剩下的内容。在但它的与整个字符串匹配。如果您使用的是}包含{},而{}包含{}。但是
search()
或finditer()
,那么您将能够查看MatchObject并看到{findall()
返回字符串,而不是MatchObjects。如果没有组,则返回总体匹配的列表;如果有组,则列表包含所有捕获,但不是整体匹配。在所以两个正则表达式都匹配整个字符串,但第一个正则表达式也分别捕获和丢弃每个字符(这有点毫无意义)。只是
findall()
的意外行为让你看起来得到了不同的结果。在在第一个示例中,您有一个只捕获最后一次迭代的重复捕获组。这里
c
。在Debuggex Demo
在第二个示例中,您将匹配列表中的单个字符,并且不限次数。在
^{pr2}$Debuggex Demo
我是这么想的。
([abc])+
正在尝试重复捕获的组。当你在捕获组后面使用“+”时,并不意味着你将得到两个捕获组。最终发生的事情是“+”强制迭代,直到捕获组只包含最后一个匹配项,至少对于Python的regex和大多数实现来说是这样。在如果您想捕获一个重复的表达式,您需要颠倒“(…)”和“+”的顺序,例如,而不是
([abc])+
使用([abc]+)
。在相关问题 更多 >
编程相关推荐