2013-06-26 20 views
3

我試圖使用python RE蟒RE:非貪婪匹配,repitition和分組

input_string匹配重複線圖案:

start_of_line:X
線1
線2
start_of_line:Y
線1
線2
線3
start_of_line位:Z
線1

基本上我想在一個循環中,以提取字符串(每個字符串從start_of_line開始,直到下一個start_of_line之前的所有字符)

我可以使用for循環容易解決這個問題,但不知道是否有一個蟒蛇RE做到這一點,盡我所能,但陷入了分組部分。

它類似於像一個解決方案,我最近事情是

pattern= re.compile(r"start_of_line:.*?", re.DOTALL) 
for match in re.findall(pattern, input_string): 
    print "Match =", match 

但它打印

Match = start_of_line: 
Match = start_of_line: 
Match = start_of_line: 

如果我做什麼別的組,我失去了比賽。

回答

3

要使用正則表達式做到這一點,你必須使用一個超前測試:

r"start_of_line:.*?(?=start_of_line|$)" 

otherwhise,因爲你用惰性限定符(*?),你會start_of_line:

後獲得最短的匹配可能,即什麼

另一種方式:

r"start_of_line:(?:[^\n]+|\n(?!start_of_line:))*" 

這裏我用一個包含所有,但換行字符類(\n)重複一次或多次。當正則表達式引擎發現新行時,它會測試start_of_line:是否不遵循。我重複這個組零次或多次。因爲只有當一個換行符是相遇(相對於每個字符)

+0

你並不真的需要先行進行超前

這種模式是比第一更高效,就是不讓它匹配的部分組。你也可能想要'| $)'。所以:'r'start_of_line:(。*?)(?: start_of_line | $)'然後在組1上工作。 –

+0

@andrewcooke:'| $'的好處,但是如果使用組,則會產生重疊問題。 –

+0

工程就像一個魅力(沒有$分隔符,最後一個字符串不匹配),感謝您分享您的專業知識。 – sysuser