我试图解析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)的最后一个(?)号码
答案 0 :(得分: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个十六进制值而不是变量数。
答案 1 :(得分:0)
好的,最后我发现我需要将所有数字都抓到一个组然后拆分(感谢this question和Martijn Pieters)
正确的代码是
r = re.findall(r'^ \s+ (\w+) \s+ ((?:0x [\da-f]+ \s+)*)', oo, re.VERBOSE)
numbers = r[0][1].split()