2013-10-07 66 views
1

我試圖檢測調用鏈之間的函數。使用正則表達式查找函數調用

例如,我可以用

re.search("([\w_]+)\((|[\W\d\w\,]+)\)", line) 

找到

print(len("AA")) 

,但它是相當不兼容類似的代碼:

print(i + len("AA") + j + len("BBB")) 

幫助我。

import ast 

a = ast.parse('print(i + len("AA") + j + len("BBB"))') 
print ast.dump(a) 

>>> 
Module(body=[Print(dest=None, values=[BinOp(left=BinOp(left=BinOp(left=Name(id='i', 
ctx=Load()), op=Add(), right=Call(func=Name(id='len', ctx=Load()), args=[Str(s='AA')], 
keywords=[], starargs=None, kwargs=None)), op=Add(), right=Name(id='j', ctx=Load())), 
op=Add(), right=Call(func=Name(id='len', ctx=Load()), args=[Str(s='BBB')], keywords=[], 
starargs=None, kwargs=None))], nl=True)]) 
+1

你想解析Python代碼嗎? – 2013-10-07 08:13:58

+4

首先,使用正則表達式分析嵌套函數調用並不是一個好主意,因爲語言不是常規的。第二,你可以使用ast模塊來分析python代碼 – gefei

+0

也許一個profiler會幫助你在這裏看到一個調用者圖形,例如''pydoc -k profile''。順便說一句:「幫幫我。」聽起來有點粗魯,「請幫助我。」會更有禮貌,但在SX這裏都不需要。 – math

回答

1

您的需求可以由ast模塊得到更好的服務

(\w+)\(((?:[^()]*\([^()]*\))*[^()]*)\) 

這抓住了函數的名稱在第1組,和內容的括號(參數)。

看到這個正則表達式的live demo與你的例子。


順便說一句,你的正則表達式可以使用一些注意事項:

  • [\w_]+僅相當於\w+因爲\w包括強調
  • [\W\d\w\,]僅相當於.,因爲該組合\W\w(一切不是字符字符和每個字符)包括所有內容