使用findall捕获分组?
如果我使用 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')]
相关文档摘录:
这个函数会返回字符串中所有不重叠的匹配项,结果以字符串的列表形式呈现。它会从左到右扫描字符串,并按照找到的顺序返回匹配项。如果模式中有一个或多个分组,它会返回一个分组的列表;如果模式中有多个分组,结果会是一个包含多个元组的列表。空匹配也会包含在结果中,前提是它们不和其他匹配的开头重叠。