我试图绕着正则表达式,但我仍然遇到问题。我有这个输出(来自objdump -D
):
804869f: e8 cc fe ff ff call 8048570 <socket@plt>
8048713: e8 38 fe ff ff call 8048550 <bind@plt>
8048750: e8 0b fe ff ff call 8048560 <listen@plt>
我想获取调用发生的地址(第一列)和函数名称(即:socket,bind,listen)。
我试过这个:
match = re.match(r' (.*): (.*) <(.*)@plt>', line)
print match.group(1)
print match.group(3)
根据我的理解,我希望这可行。第一组应该是第一个空格char和冒号之间的字符串,第三个组应该位于<
和@
个字符之间。我得到AttributeError: 'NoneType' object has no attribute 'group'
答案 0 :(得分:1)
您正在进行非贪婪的比赛
.*
吃掉所有角色,而不是事先知道事情
更好的模式可以构成如下:
st=re.match(r'\s+([0-9A-Fa-f]+):' # Address starting with one or more space
r'\s+.+?' # Skip characters (non-greedy using ?)
r'([0-9A-Fa-f]+)\s+' # Address followed by space
r'<(\S+)@plt>', # function name, anything except space
line)
还要经常检查匹配是否成功,
if st: # Use st or some different variable other then 'match' itself
print st.group(1)
print st.group(2)
print st.group(3)