2011-12-13 80 views
2

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

和平常免责声明:我做这个搜索,而问题是接近我的,但我想知道我的需求是否足以克服“常规与非常规”语言问题。这是我得到的不是计算机科学专业并害怕正规表达。

+1

你确定正则表达式是最好的工具吗? Python有几个用于代码自省的内置库。见http://docs.python.org/library/language.html – DaveP

+0

@DaveP我不是。我习惯性地想到正则表达式,因为它就像SE转向PERL一样。我学到了很多自学编程的知识(从C开始),但有一些经典的东西我错过了没有获得CS学位,就像学习语法。我非常喜欢雷蒙德的答案,所以我会首先尝试一下,因为我觉得它更可靠,更不容易出错,再加上我会学到很多东西。我也将测试Sylverdrag的答案,因为我认为他可能是一个非常好的短期解决方案(只要我通过测试)。 – jeremyosborne

回答

8

这应该做你想要什么:

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

谢谢Sylverdrag。我相信这将是一个很好的短期解决方案。让我测试一下,并确保它在解析我的python文件时不会呕吐。 [编辑:相反,让我确保我的python文件不会破坏你的正则表达式;]] – jeremyosborne

+0

谢谢Sylverdrag,这就是我要找的。对此的一些调整将立即为我服务。 – jeremyosborne

+1

这不会捕获带下划线'_'的函数名称。正确的版本是:'[a-z_A-Z] + \([^ \)] * \)(\。[^​​ \)] * \))?' – SatA

1

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标准库的工具集之一:

+0

谢谢Raymond。我相信你正在回答我真正的问题,那就是如何可靠地做到这一点,并让它(基本上)是防弹的。我会在今天晚些时候尝试一下,当我有空时。 – jeremyosborne