2013-10-18 28 views
-2

這是我的字符串:如何在這種情況下使用LookBehind?我迷路了

myclass.test() and(myclass.mytest() and myclass.test("argument")) or (myclass.mytests(1)) 

我想只捕獲括號的開口「(」這不是一個功能的一部分,

於是,我就開始捕捉功能(然後拒絕此規則):

\w*\.\w[^(]*\(

完美,我只捕獲功能,當我試圖用下面的表達式我沒有成功

(爲什麼?)
(?<=(\w*\.\w[^(]*\())\(

備註: - myclass。從未改變 - 不要忘記 「和(」 - ?(< = T)(<工作正常

謝謝:)


治標不治本

我會繼續學習並試圖應用這種情況下的「向後看」,這似乎是一個有趣的方法,但我們的朋友@ hwnd提出了一種適用於我的案例的不同方法:

\((?=myclass) 

謝謝你們。

+2

在哪種語言做呢? Java不支持可變長度後視。並且'和(...)'也被認爲是一個函數,對嗎? – justhalf

+0

我想你可以刪除後面的最後一個圓括號。它不應該在那裏。所以,試試這個來捕獲不屬於函數的括號的開頭:'(?<!(\ w * \。\ w [^(] *))\(' – justhalf

+0

@justhalf python :) – Jonny

回答

1

我有點困惑什麼是功能的一部分或不在這裏。

要匹配以下myclass.test(部件你可以做。

[a-zA-Z]+\.[a-zA-Z]+\(

這兩個將匹配開放括號中的那不是myclass.功能的一部分。

正預測先行

\((?=[^)]) 

正則表達式:

\(   '(' 
(?=   look ahead to see if there is: 
[^)]  any character except: ')' 
)   end of look-ahead 

負先行

\((?!\)) 

正則表達式:

\(   '(' 
(?!  look ahead to see if there is not: 
    \)  ')' 
)   end of look-ahead 

請參閱live demo

您甚至可能在這裏使用負面看起來背後。

(?<!\.)\((?!\)) 
+0

我不是一個正則表達式的專家,但不會'\((?!\))'是否足夠?爲什麼你需要左括號的後視?字符串不包含任何後面的開頭括號,是否??至少,結果在刪除後視圖後,您的現場演示保持不變。 – gehho

+0

@hwnd當我使用像測試(「xxx」)這樣的參數時,不應該工作:(我只是想要不是來自方法的括號,所以在這種情況下輸入前面的例子。 – Jonny

+0

@gehho test(「xxx」):( – Jonny

0

既然你不能使用Python中的可變長度的回顧後,你將需要做一些工作之外的正則表達式。一種可能的方法是捕獲兩個組,第一個捕獲class.function部分(如果存在),第二個捕獲左括號。所以你可以把第一組沒有匹配的圓括號。

在這種情況下,我們檢查匹配長度是否爲一個字符(即只有左括號),然後打印匹配的索引。您可以打印匹配的字符串也,這將是一個開放的括號= d

import re 
text = 'myclass.test() and(myclass.mytest() and myclass.test("argument")) or (myclass.mytests(1))' 
for result in re.finditer(r'(\w+\.\w[^(]*\()?\(',text): 
    if result.end()-result.start()==1: 
     print result.span(), result.string 

結果:

 
(18,19) 
(69,70)