2012-10-30 54 views
1

我有一個文件格式如下:Python的正則表達式匹配,直到字符多行

hello = { 

    a = "2354a" 
    b = "06567567h" 


} 

goodbye = { 
    there = "/home/afhge" 

} 

... 

anotherset = { 
     dsfsdf = grhbrwecs 
     dfgtmyj = 12345 

} 

我正在使用python的正則表達式,我想匹配的是括號內的一切因此產生的匹配輸出會以下列表:

['\n\n\ta = "2345a"\n\tb = "06567567h"\n\n\n', '\n\there = "/home/afhge"\n\n', '\n\tdsfsdf = grhbrwecs\n\tdfgtmyj = 12345\n\n'] 

我已經試過正則表達式:

desired_output = re.findall("{[^}]", file_text) 

howeve這個正則表達式的結果在列表中:

['{\n', '{\n', '{\n', '{\n', '{\n'] 

它看起來像[^}]匹配任何字符,直到換行。我試着這樣做:!

desired_output = re.findall("{[^}]", file_text, re.S) 

desired_output = re.findall("{[^}]", file_text, re.M) 

要沒有成功:(

感謝

回答

8

沒有你的角色類是正確的它會匹配任何字符。不是}(甚至是換行符)問題是[^}]只能匹配一個字符,只需使用一個重複量詞(並且您應該可以跳過{):

r"\{[^}]*" 

關於您嘗試的選項。如果有什麼東西re.S會有幫助,因爲沒有它.不符合換行符。但.真的是唯一受re.S影響的東西。另一個選項re.M與它無關。這隻會讓錨點^$在線的起點和終點處都匹配。

而且,因爲你只需要在括號內的內容,你並不需要匹配{本身,而是你可以使用一個回顧後改爲:

r"(?<=\{)[^}]*" 

這將不包括在該{比賽。

+0

驚人的這個工作的感謝! 至於不包括{在比賽中,我只是圍繞我想顯示的代碼括號。我的新正則表達式: 「\ {([^ \}] *)」 – m3hughes

+0

@ m3hughes yup這是一種不同的可能性。 –

2

您應該使用(?<={).*?(?=})

你的正則表達式是缺少}指定到哪裏結束它匹配0到多個字符匹配和.*?直到它匹配的第一個}

+0

工程,但我給了驗證m.buettner的答案,因爲它有更多的細節關於re.S和re.M這是有幫助的。 – m3hughes