使用正则表达式查找函数调用

时间:2013-10-07 08:04:14

标签: python regex

我正在尝试检测调用链之间的函数。

例如,我可以使用

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

找到

print(len("AA"))

但它与以下代码完全不兼容:

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

帮助我。

2 个答案:

答案 0 :(得分:1)

ast模块可能会更好地满足您的需求:

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 :(得分:0)

使用此正则表达式:

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

这将捕获组1中函数的名称,以及组2中括号(参数)的内容。

使用您的示例查看此正则表达式的live demo


顺便说一句,你的正则表达式可能会引起注意:

  • [\w_]+仅相当于\w+,因为\w包含下划线
  • [\W\d\w\,]仅相当于.,因为组合\W\w(一切都不是字char和每个字char)包含所有内容