正则表达式匹配Python函数调用

xra*_*alf 3 python regex

我想在Python中创建一个与Python源代码中的一行匹配的正则表达式,并返回一个函数调用列表.

典型的线条如下所示:

something = a.b.method(time.time(), var=1) + q.y(x.m())
Run Code Online (Sandbox Code Playgroud)

结果应该是:

["a.b.method()", "time.time()", "q.y()", "x.m()"]
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 创建正确的模式
  2. 捕捞组是重叠的

谢谢你的帮助

geo*_*org 11

我不认为正则表达式是最好的方法.改为考虑ast模块,例如:

class ParseCall(ast.NodeVisitor):
    def __init__(self):
        self.ls = []
    def visit_Attribute(self, node):
        ast.NodeVisitor.generic_visit(self, node)
        self.ls.append(node.attr)
    def visit_Name(self, node):
        self.ls.append(node.id)


class FindFuncs(ast.NodeVisitor):
    def visit_Call(self, node):
        p = ParseCall()
        p.visit(node.func)
        print ".".join(p.ls)
        ast.NodeVisitor.generic_visit(self, node)


code = 'something = a.b.method(foo() + xtime.time(), var=1) + q.y(x.m())'
tree = ast.parse(code)
FindFuncs().visit(tree)
Run Code Online (Sandbox Code Playgroud)

结果

a.b.method
foo
xtime.time
q.y
x.m
Run Code Online (Sandbox Code Playgroud)

  • @AdamParkin:[这个问题](http://stackoverflow.com/questions/11306641/what-kind-of-formal-languages-can-modern-regex-engines-parse)的一些答案对你来说可能很有意思. (2认同)