我不明白为什么正则表达式^(.)+$
匹配字符串的最后一个字母。我认为它会匹配整个字符串。
Python 中的示例:
>>> text = 'This is a sentence'
>>> re.findall('^(.)+$', text)
['e']
我不明白为什么正则表达式^(.)+$
匹配字符串的最后一个字母。我认为它会匹配整个字符串。
Python 中的示例:
>>> text = 'This is a sentence'
>>> re.findall('^(.)+$', text)
['e']
如果有一个(或多个)捕获组,则re.findall
返回不同:
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。空匹配包含在结果中,除非它们触及另一个匹配的开始。
如果一个组匹配多次,则只能访问最后一个匹配:
如果要获取整个字符串,请使用非捕获组:
>>> 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
which yield match 对象。使用MatchObject.group()
,您可以获得整个匹配的字符串:
>>> [m.group() for m in re.finditer('^(.)+$', text)]
['This is a sentence']
因为捕获组只是一个字符(.)
。由于量词,正则表达式引擎将继续匹配整个字符串+
,并且每次都会将捕获组更新为最新匹配。最后,捕获组将是最后一个字符。
即使您使用findall
,第一次应用正则表达式时,由于+
量词,它将继续匹配整个字符串直到最后。并且由于到达了字符串的末尾,因此不会再次应用正则表达式,并且调用只返回一个结果。
如果删除+
量词,那么第一次,正则表达式将只匹配一个字符,因此将一次又一次地应用正则表达式,直到消耗整个字符串,findall
并将返回字符串中所有字符的列表。
注意+
默认情况下是贪婪的,它匹配所有字符直到最后一个。由于捕获组中仅存在点,因此上述正则表达式匹配从头开始的所有字符,但仅捕获最后一个字符。由于findall
函数优先考虑组,因此它只打印出组内存在的字符。
re.findall('^(.+)$', text)