使用正则表达式从objdump中提取地址和函数调用

时间:2014-05-10 12:41:59

标签: python regex

我试图绕着正则表达式,但我仍然遇到问题。我有这个输出(来自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'

1 个答案:

答案 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)