使用Python正则表达式查找文件中的函数调用的正则表达式?

2 投票
3 回答
14864 浏览
提问于 2025-04-17 08:16

我想要一个正则表达式,打算用在Python的re模块里,这个表达式可以在Python文件中查找函数调用。不过,我对要查找的函数调用有一些特别的要求。

  • 这些函数调用必须有一个特定的名字。
  • 函数调用可以是连着的,但只能有一个连着的调用,并且这个调用的名字也必须是一样的。
  • 第一个函数调用总是需要一个字符串作为参数。
  • 而连着的那个函数调用可以接受任意数量的参数(这让我有点担心)。

下面是我想在文件中查找的函数使用示例:

# Simple function call.
f("_key")

# The chained function call, in the simplest format (no args).
f("_key").g()

# The chained function call with simple arguments.
f("_key").g("hello", 1337)

# The chained function call with possible, more complex arguments
f("_key").g(obj.blah(), {"dog":"cat"})

# And then the possibility for long function calls to extend over one line
f("_key").g(
            "dogs",
            "cats",
            {"living":"together"})

还有一个常见的声明:我搜索过这个问题,发现有些问题和我的差不多,但我在想我的需求是否足够具体,以避免“规则与不规则”语言的问题。真是因为我不是计算机专业的,对正则表达式有点害怕。

3 个回答

0

我觉得这个更适合(更准确地说是在一个函数里面还有另一个函数的情况):

\w+\([^\)]*\){1,}(\.[^\)]*\))?
1

顺便提一下,这里有一段来自Grammar/Grammar的摘录:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE

trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME

power: atom trailer* ['**' factor]
atom: ('(' [yield_expr|testlist_comp] ')' |
       '[' [listmaker] ']' |
       '{' [dictorsetmaker] '}' |
       '`' testlist1 '`' |
       NAME | NUMBER | STRING+)

arglist: (argument ',')* (argument [',']
                         |'*' test (',' argument)* [',' '**' test] 
                         |'**' test)

这些是需要通过正则表达式来处理的情况,以确保能够捕捉到所有的函数调用,而不会出现错误的匹配。

与其使用正则表达式,不如利用Python标准库中自带的一些工具:

8

这段代码应该能满足你的需求:

[a-zA-Z]+\([^\)]*\)(\.[^\)]*\))?

撰写回答