我正在尝试检测调用链之间的函数。
例如,我可以使用
re.search("([\w_]+)\((|[\W\d\w\,]+)\)", line)
去寻找
print(len("AA"))
但它与以下代码合理地不兼容:
print(i + len("AA") + j + len("BBB"))
帮我。
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)])
使用这个正则表达式:
(\w+)\(((?:[^()]*\([^()]*\))*[^()]*)\)
这将捕获第 1 组中的函数名称,以及第 2 组中括号(参数)中的内容。
查看此正则表达式与您的示例一起使用的现场演示。
顺便说一句,您的正则表达式可能会引起注意:
[\w_]+
等价于仅仅\w+
因为\w
包含下划线[\W\d\w\,]
等同于 just .
,因为组合\W\w
(不是单词 char 和每个单词 char)包括所有内容