使用findall捕获分组?

102 投票
4 回答
115579 浏览
提问于 2025-04-16 17:44

如果我使用 findall(r'regex(with)capturing.goes.here'),我该如何访问捕获的组呢?我知道可以通过 finditer 来做到这一点,但我不想一个一个地遍历。

4 个回答

3
import re
string = 'Perotto, Pier Giorgio'
names = re.findall(r'''
                 (?P<first>[-\w ]+),\s #first name
                 (?P<last> [-\w ]+) #last name
                 ''',string, re.X|re.M)

print(names)

返回值

[('Perotto', 'Pier Giorgio')]

re.M 这个选项在你的字符串有多行的时候才有意义。另外,我写的正则表达式需要 VERBOSE 模式(也就是 re.X),因为它使用了 ''' 这种写法。

46

可以随意使用分组。匹配的结果会以一系列的组元组返回:

>>> re.findall('(1(23))45', '12345')
[('123', '23')]

如果你想把完整的匹配结果也包含在内,只需把整个正则表达式放在一个括号里:

>>> re.findall('(1(23)45)', '12345')
[('12345', '23')]
120

findall 这个函数的作用就是返回你找到的所有匹配部分:

>>> re.findall('abc(de)fg(123)', 'abcdefg123 and again abcdefg123')
[('de', '123'), ('de', '123')]

相关文档摘录:

这个函数会返回字符串中所有不重叠的匹配项,结果以字符串的列表形式呈现。它会从左到右扫描字符串,并按照找到的顺序返回匹配项。如果模式中有一个或多个分组,它会返回一个分组的列表;如果模式中有多个分组,结果会是一个包含多个元组的列表。空匹配也会包含在结果中,前提是它们不和其他匹配的开头重叠。

撰写回答