0

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

Python 中的示例:

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

3 回答 3

4

如果有一个(或多个)捕获组,则re.findall返回不同:

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


并根据MatchObject.group文档

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

如果要获取整个字符串,请使用非捕获组:

>>> 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.finditerwhich yield match 对象。使用MatchObject.group(),您可以获得整个匹配的字符串:

>>> [m.group() for m in re.finditer('^(.)+$', text)]
['This is a sentence']
于 2015-02-18T13:36:51.193 回答
1

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

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

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

于 2015-02-18T13:39:04.817 回答
0

注意+默认情况下是贪婪的,它匹配所有字符直到最后一个。由于捕获组中仅存在点,因此上述正则表达式匹配从头开始的所有字符,但仅捕获最后一个字符。由于findall函数优先考虑组,因此它只打印出组内存在的字符。

re.findall('^(.+)$', text)
于 2015-02-18T13:39:13.743 回答