如果findall(r'regex(with)capturing.goes.here')
,我如何访问捕获的群组?
我知道我可以通过finditer
来完成,但我不想迭代。
答案 0 :(得分:54)
findall
只返回捕获的组:
>>> re.findall('abc(de)fg(123)', 'abcdefg123 and again abcdefg123')
[('de', '123'), ('de', '123')]
相关文件摘录:
返回所有非重叠的匹配项 字符串中的模式,作为列表 字符串。扫描字符串 从左到右,比赛是 按顺序返回。如果一个或 更多的团体出现在 模式,返回组列表;这个 将是一个元组列表,如果 模式有多个组。空 匹配包含在结果中 除非他们触及开头 另一场比赛。
答案 1 :(得分:19)
自由使用群组。匹配将作为组元组列表返回:
>>> re.findall('(1(23))45', '12345')
[('123', '23')]
如果要包含完整匹配,只需将整个正则表达式括在一个组中:
>>> re.findall('(1(23)45)', '12345')
[('12345', '23')]
答案 2 :(得分:1)
有几种方法可以:
>>> import re
>>> r = re.compile(r"'(\d+)'")
>>> result = r.findall("'1', '2', '345'")
>>> result
['1', '2', '345']
>>> result[0]
'1'
>>> for item in result:
... print(item)
...
1
2
345
>>>
答案 3 :(得分:0)
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
)模式,因为它正在使用'''