我试图解析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)
好吧,最后我发现我需要把所有的数字分成一组,然后再把它们分开(多亏了this question和Martijn Pieters)
正确的代码是
当匹配多个模式时,捕获组不会繁殖。它们只捕获一次,这是本例中要匹配的最后一个模式。你知道吗
捕获所有十六进制数,然后拆分结果:
输出
另一种方法是定义6个组,一个用于前导
EXIDX
模式,一个用于5个十六进制模式,但这会将模式锁定为5个十六进制值,而不是一个可变数字。你知道吗相关问题 更多 >
编程相关推荐