我正在尝试检测调用链之间的函数。
例如,我可以使用
re.search("([\w_]+)\((|[\W\d\w\,]+)\)", line)
找到
print(len("AA"))
但它与以下代码完全不兼容:
print(i + len("AA") + j + len("BBB"))
帮助我。
答案 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)包含所有内容