【问题标题】:Regular expression to find function calls in a file with Python regular expression?使用 Python 正则表达式在文件中查找函数调用的正则表达式?
【发布时间】:2011-12-13 05:23:05
【问题描述】:

我想要一个正则表达式,我将在 Python re 模块中使用它,它将在 Python 文件中查找 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"})

以及通常的免责声明:我对此进行了搜索,问题与我的问题很接近,但我想知道我的需求是否受到足够的限制以解决“常规与不规则”语言问题。这就是我不是计算机科学专业并且害怕正则表达式的结果。

【问题讨论】:

  • 你确定正则表达式是最好的工具吗? Python 有几个用于代码自省的内置库。见docs.python.org/library/language.html
  • @DaveP 我不是。我习惯性地想到正则表达式,因为它有点像转向 PERL 的 SE。我学到了很多自学编程(从 C 开始),但有一些经典的东西我只是错过了没有获得 CS 学位,比如学习语法。我真的很喜欢雷蒙德在下面的回答,所以我要先尝试一下,因为我觉得它更可靠,更不容易出错,而且我会学到很多东西。我还将测试 Sylverdrag 的答案,因为我认为他可能是一个非常好的短期解决方案(只要我汇总的测试通过)。

标签: python regex


【解决方案1】:

这应该做你想做的:

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

【讨论】:

  • 谢谢西尔弗德拉格。我相信这将是一个很好的短期解决方案。让我测试一下,确保它在解析我的 python 文件时不会呕吐。 [编辑:相反,让我确保我的 python 文件不会破坏你的正则表达式;)]
  • 谢谢 Sylverdrag,这就是我要找的。对此进行一些调整现在对我很有帮助。
  • 这不会捕获带有下划线 _ 的函数名称。正确的版本是:[a-z_A-Z]+\([^\)]*\)(\.[^\)]*\))?
  • 不适用于我的功能textureLod( iChannel0, (uv+118.4)/256.0, 0 ); 正确的版本是[\w]+(?=\().+\)
  • 不知道为什么这被认为是一个好的答案,它似乎与 test("allo"). test2" allo", "hey) 这样的东西相匹配,这没有多大意义
【解决方案2】:

FWIW,这是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 标准库附带的工具集之一:

【讨论】:

  • 谢谢雷蒙德。我相信您正在回答我真正的问题,即如何可靠地做到这一点并使其(基本上)是防弹的。我会在今天晚些时候有空的时候尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2020-09-14
相关资源
最近更新 更多