Python 为什么这个正则表达式不能捕获请求的组?

Python 为什么这个正则表达式不能捕获请求的组?,python,regex,Python,Regex,我正在尝试解析readelf输出: import re o = ' EXIDX 0x000590 0x002c0590 0x002c0590 0x00008 0x00008 R 0x4' re.findall(r'^ \s+ (\w+) \s+ (?:(0x [\da-f]+ )\s+)+', o, re.VERBOSE) # (1) # [('EXIDX', '0x00008')] 为什么只捕获一个十六进制数?我预料 re.findall(r'^ \s+ (\

我正在尝试解析
readelf
输出:

import re
o = '      EXIDX          0x000590 0x002c0590 0x002c0590 0x00008 0x00008 R   0x4'
re.findall(r'^ \s+ (\w+) \s+ (?:(0x [\da-f]+ )\s+)+', o, re.VERBOSE) # (1)
# [('EXIDX', '0x00008')]
为什么只捕获一个十六进制数?我预料

re.findall(r'^ \s+ (\w+) \s+ (?:(0x [\da-f]+ )\s+)+', o, re.VERBOSE) 
# [('EXIDX', '0x000590', '0x002c0590', '0x002c0590', '0x00008', '0x00008')]
当我尝试这个RE时,它给出了至少可以理解的结果,即只匹配第一个数字:

re.findall(r'^ \s+ (\w+) \s+ (0x [\da-f]+ )\s+', oo, re.VERBOSE)
# [('EXIDX', '0x000590')]
我不明白为什么我只得到最后一个(?)数,而RE(1)

当匹配多个模式时,捕获组不相乘。它们只捕获一次,即本例中要匹配的最后一个模式

捕获所有十六进制数,然后拆分结果:

o = '      EXIDX          0x000590 0x002c0590 0x002c0590 0x00008 0x00008 R   0x4'
[[r[0]] + r[1].split() for r in re.findall(r'^ \s+ (\w+) \s+ ((?:0x [\da-f]+ \s+)*)', o, re.VERBOSE)]
输出

[['EXIDX', '0x000590', '0x002c0590', '0x002c0590', '0x00008', '0x00008']]

另一种方法是定义6个组,一个用于前导的
EXIDX
模式,一个用于5个十六进制模式,但这会将模式锁定为5个十六进制值,而不是一个可变数字。

好的,最后我发现我需要将所有数字抓取到一个组中,然后将其拆分(感谢和Martijn Pieters)

正确的代码是

r = re.findall(r'^ \s+ (\w+) \s+ ((?:0x [\da-f]+ \s+)*)', oo, re.VERBOSE)
numbers = r[0][1].split()

您的RE仅捕获带有空格的最后一个数字