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

Python 使用正则表达式查找函数调用,python,regex,Python,Regex,我正在尝试检测调用链之间的函数 例如,我可以使用 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)

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

例如,我可以使用

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)])

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\u]+
    只相当于
    \w+
    ,因为
    \w
    包含下划线
  • [\W\d\W\,]
    仅相当于
    ,因为组合
    \W\W
    (不是单词字符的所有内容)包括所有内容
使用此正则表达式:

(\w+)\(((?:[^()]*\([^()]*\))*[^()]*)\)
这将捕获组1中函数的名称,以及组2中括号(参数)中的内容

请参阅此正则表达式的一个示例


顺便说一句,你的正则表达式需要一些注意:

  • [\w\u]+
    只相当于
    \w+
    ,因为
    \w
    包含下划线
  • [\W\d\W\,]
    仅相当于
    ,因为组合
    \W\W
    (不是单词字符的所有内容)包括所有内容

是否要解析Python代码?首先,使用正则表达式解析嵌套函数调用不是一个好主意,因为该语言不是常规语言。其次,您可以使用ast模块来分析python代码。也许在这里,分析器可以帮助您查看调用程序图,例如:
pydoc-k profile
。顺便说一句:“帮帮我。”听起来有点粗鲁,“请帮帮我。”会更礼貌一些,但在SX这里这两个都不需要。你想解析Python代码吗?首先,用正则表达式解析嵌套函数调用不是一个好主意,因为语言不规则。其次,您可以使用ast模块来分析python代码。也许在这里,分析器可以帮助您查看调用程序图,例如:
pydoc-k profile
。顺便说一句:“帮帮我。”听起来有点粗鲁,“请帮帮我。”会更有礼貌,但在SX这里这两个都不需要。