1

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

例如,我可以使用

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

去寻找

print(len("AA"))

但它与以下代码合理地不兼容:

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

帮我。

4

2 回答 2

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)])
于 2013-10-07T08:29:11.913 回答
0

使用这个正则表达式:

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

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

查看此正则表达式与您的示例一起使用的现场演示。


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

  • [\w_]+等价于仅仅\w+因为\w包含下划线
  • [\W\d\w\,]等同于 just .,因为组合\W\w(不是单词 char 和每个单词 char)包括所有内容
于 2013-10-07T12:32:53.023 回答