Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个正则表达式之间的差异:[abc]+;和([abc])+;_Python_Regex - Fatal编程技术网

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]+