我不明白为什么正则表达式^(.)+$
匹配字符串的最后一个字母。我认为它会匹配整个字符串。
Python中的示例:
>>> text = 'This is a sentence'
>>> re.findall('^(.)+$', text)
['e']
答案 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)