2011-01-13 64 views
0

我目前正在開發/更新,使用了很多VIM的正則表達式來在Python的匹配類/方法/函數的Vim的正則表達式匹配

我的出發點是重新一個VIM插件類,方法或函數-use我能找到,在這種情況下,這是我一直使用的是什麼:

匹配一類

"^\\s.*class\\s\\+[a-zA-Z0-9_]\\+" 
    "\ . "\\s*\\((\\([a-zA-Z0-9_,. \\t\\n]\\)*)\\)\\=\\s*:" 

匹配一個方法

"^\\s*.def\\s\\+[a-zA-Z0-9_]\\+\\s*(\\s*self\\_[^:#]*)\\s*:" 

匹配一個功能

"^\\s*def\\s\\+[a-zA-Z0-9_]\\+\\s*(\\_[^:#]*)\\s*:" 

然而,上述證明的方式來嚴格和在某些情況下不匹配(例如如果你啓動一個方法並在「(」)之後的新行中繼續。

多的辯論之後所以,我決定放寬我的正則表達式,這就是我目前正在使用:

類:

'\v^(.*class)' 

方法:

'\v^(.*def)&(.*self)' 

功能:

'\v^(.*def)&(.*self)@!' 

迄今爲止這麼好,但我認爲我失去了正則表達式的平衡:現在是寬鬆的方式。

的問題是:

「?莫非你的廣告位的正則表達式的專業知識,我的正則表達式寬鬆,使他們匹配好一點,但不要變得過於嚴格」

獎勵積分如果保持很神奇標誌在你的答案!

+2

類/方法/功能? – Jay 2011-01-13 15:51:27

+4

'有些人在遇到問題時想'我知道,我會用正則表達式'。「現在他們有兩個問題。' (傑米Zawinski)。你確定這是你想要做的嗎? C/Java/C++ /的語法不適用於正則表達式匹配。這個是來做什麼的?我們可能會提出一些替代方法。 – DrAl 2011-01-13 16:07:06

回答

4

像這樣的東西可能會有所幫助,我不是Python或VIM專家。用什麼語言(S)

\v^\s*def\s+(\w+)\s*\(\s*(self[^)]*)\)\s*:

\v   # very magic 
^   # start of line 
    \s*  # 0 or more whitespace 
    def  # 'def' 
    \s+  # 1 or more whitespace 
    (  # start capture group 1 
     \w+  # 1 or more word [a-zA-Z0-9_] chars 
    )   # end capture group 1 
    \s*  # 0 or more whitespace 
    \(  # '(' literal open parenthesis 
    \s*  # 0 or more whitespace 
    (  # start capture group 2 
     self # 'self' 
     [^)]*  # 0 or more of not ')', includes newline 
    )   # end capture group 2 
    \)  # ')' literal close parenthesis 
    \s*  # 0 or more whitespace 
    :   # ':'