Regex中的圆括号是什么意思?

时间:2015-02-18 13:35:32

标签: python regex capture-group

我不明白为什么正则表达式^(.)+$匹配字符串的最后一个字母。我认为它会匹配整个字符串。

Python中的示例:

>>> text = 'This is a sentence'
>>> re.findall('^(.)+$', text)
['e']

3 个答案:

答案 0 :(得分:4)

如果有一个捕获组(或组),re.findall会以不同的方式返回:

  

如果模式中存在一个或多个组,则返回列表   组;如果模式有多个,这将是一个元组列表   组。结果中包含空匹配,除非他们触摸了   另一场比赛的开始。


根据MatchObject.group documentation

  

如果某个群组多次匹配,只能访问最后一个匹配

如果您想获得整个字符串,请使用非捕获组:

>>> re.findall('^(?:.)+$', text)
['This is a sentence']

或根本不使用群组:

>>> re.findall('^.+$', text)
['This is a sentence']

或将组更改为捕获全部:

>>> re.findall('^(.+)$', text)
['This is a sentence']
>>> re.findall('(^.+$)', text)
['This is a sentence']

或者,您可以使用re.finditer生成匹配对象。使用MatchObject.group(),您可以获得整个匹配的字符串:

>>> [m.group() for m in re.finditer('^(.)+$', text)]
['This is a sentence']

答案 1 :(得分:1)

因为捕获组只是一个字符(.)。由于+量词,正则表达式引擎将继续匹配整个字符串,每次捕获组都将更新为最新匹配。最后,捕获组将是最后一个角色。

即使您使用findall,第一次应用正则表达式时,由于+量词,它将继续匹配整个字符串直到结尾。并且由于字符串的结尾已到达,正则表达式不会再次应用,并且调用只返回一个结果。

如果删除+量词,那么第一次正则表达式只匹配一个字符,因此将一次又一次地应用正则表达式,直到整个字符串被消耗,{{1} }将返回字符串中所有字符的列表。

答案 2 :(得分:0)

默认情况下,+默认情况下是贪婪的,它匹配到最后一个字符。由于只有捕获组内存在的点,上面的正则表达式从头开始匹配所有字符,但只捕获最后一个字符。由于findall函数给出了组的第一个首选项,它只打印出组内存在的字符。

re.findall('^(.+)$', text)