2011-12-13 35 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