正则匹配Python函数调用

3 投票
5 回答
4436 浏览
提问于 2025-04-17 09:09

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

一般来说,这一行的样子可能是这样的:

something = a.b.method(time.time(), var=1) + q.y(x.m())

而结果应该是:

["a.b.method()", "time.time()", "q.y()", "x.m()"]

我在这里有两个问题:

  1. 如何创建正确的模式
  2. 捕获的组重叠了

谢谢你的帮助

5 个回答

2
/([.a-zA-Z]+)\(/g

应该和方法的名字相匹配;因为你有一些嵌套的内容,所以你需要在后面加上括号。

4

这段代码是用来处理一些数据的。它的主要功能是从一个地方获取信息,然后对这些信息进行一些操作,最后再把处理后的结果返回。具体来说,它可能会涉及到循环、条件判断等基本的编程概念。

在编程中,我们常常需要从一个数据源(比如数据库或文件)读取数据,然后对这些数据进行分析或修改。这个过程就像是从冰箱里拿出食材,做成一道菜,最后把菜端上桌。

代码块中的内容可能包含了一些变量、函数和逻辑结构,这些都是编程的基础。变量就像是一个盒子,用来存放数据;函数则是一个可以重复使用的代码块,帮助我们完成特定的任务;而逻辑结构则帮助我们决定在什么情况下执行哪些操作。

总之,这段代码的目的是为了让计算机能够自动化地处理信息,减少我们手动操作的工作量。

$ python3
>>> import re
>>> from itertools import chain
>>> def fun(s, r):
...     t = re.sub(r'\([^()]+\)', '()', s)
...     m = re.findall(r'[\w.]+\(\)', t)
...     t = re.sub(r'[\w.]+\(\)', '', t)
...     if m==r:
...         return
...     for i in chain(m, fun(t, m)):
...         yield i
...
>>> list(fun('something = a.b.method(time.time(), var=1) + q.y(x.m())', []))
['time.time()', 'x.m()', 'a.b.method()', 'q.y()']
13

我觉得正则表达式在这里不是最好的选择。可以考虑使用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)

结果

a.b.method
foo
xtime.time
q.y
x.m

撰写回答