Python 两个正则表达式之间的差异:[abc]+;和([abc])+;
被分组的那个弄糊涂了。这有什么区别呢?分组只是给出了不同的偏好Python 两个正则表达式之间的差异:[abc]+;和([abc])+;,python,regex,Python,Regex,被分组的那个弄糊涂了。这有什么区别呢?分组只是给出了不同的偏好 ([abc])+=>从所选内容中查找一个。可以匹配一个或多个。它发现一个且所有条件都满足,因为+表示1个或多个。这将正则表达式分为两个阶段 而未分组的一个被视为一个整体 输入“abc” 匹配单个字符=>“a” +在一次和无限次之间,尽可能多地=>“abc” 捕获组([abc])=>“a” +重复捕获组只捕获最后一次迭代=>“c”在第一个示例中,您有一个重复捕获组,它只捕获最后一次迭代。这里是c ([abc])+ 在第二个示例中
([abc])+
=>从所选内容中查找一个。可以匹配一个或多个。它发现一个且所有条件都满足,因为+表示1个或多个。这将正则表达式分为两个阶段
而未分组的一个被视为一个整体 输入“abc”
匹配单个字符=>“a”
+在一次和无限次之间,尽可能多地=>“abc”
捕获组([abc])=>“a”
+重复捕获组只捕获最后一次迭代=>“c”在第一个示例中,您有一个重复捕获组,它只捕获最后一次迭代。这里是
c
([abc])+
在第二个示例中,您将对列表中的单个字符进行一次和无限次的匹配
([abc])+
我会这样想<代码>([abc])+正在尝试重复捕获的组。当您在捕获组之后使用“+”时,并不意味着您将获得两个捕获组。至少对于Python的正则表达式和大多数实现来说,“+”强制迭代,直到捕获组只包含最后一个匹配项为止
如果要捕获重复表达式,需要颠倒“(…)”和“+”的顺序,例如,使用
([abc]+)
而不是([abc]+)
这里需要解释两件事:量化组的行为和findall()
方法的设计
在第一个示例中,[abc]
与组1中捕获的a
匹配。然后它匹配b
并在组1中捕获它,覆盖a
。然后再次使用c
,这就是比赛结束时第1组剩下的内容
但它确实匹配整个字符串。如果使用的是search()
或finditer()
,则可以查看匹配对象,并看到组(0)
包含abc
和组(1)
包含c
。但是findall()
返回字符串,而不是匹配对象。如果没有组,它将返回全部匹配的列表;如果存在组,则列表包含所有捕获,但不包含整体匹配
因此,两个正则表达式都匹配整个字符串,但第一个正则表达式也分别捕获和丢弃每个字符(这有点毫无意义)。只有
findall()
的意外行为才使您看起来得到了不同的结果。这种解释是完全错误的。不涉及短路。如果此解释正确,第一个findall
将返回['a']
,而不是['c']
。短圈可能是错误的术语。所有条件都满足。-将语言改为reflectNo,不仅仅是“短路”是错误的术语。工作机制与你描述的不一样。另一个例子是,^([abc])+$
也没有给出'abc'
re.findall
对分析造成了不利影响,因为re.findall(“[abc]+”,“abc”)
在不使用括号的情况下捕获了所有内容(然后显示完全匹配…)请尝试re.search(r'([abc])+,“abc')。组(1)
re.search(r'([abc]+),“abc')。组(1)
[abc]+
([abc])
([abc])+
([abc])+
[abc]+