2013-08-01 75 views
1

我想匹配這個文件的括號中的頂部,我試圖解析。匹配文件的頂級括號

例如

// some other garbage 
Package() 
{ 
// ... lots of garbage in here including nested Package() and commented code 
} 
// some other garbage 

這是我的嘗試,但其中間因某種原因被隨機切斷。我已經使用NotePad ++驗證了頂級匹配,這意味着其他內部匹配。

import re 

f = open('someTextFile.txt', 'r') 
contents = f.read() 

r = re.compile("Package\(\)\s*{(.+)\s*}") 
m = r.search(contents) 
inner_str = m.group(1) 
print inner_str 

有什麼建議嗎?

+1

你可以發佈什麼時候運行它嗎?它只是幫助更快地理解發生了什麼。另外,嘗試打印內容並查看它是否符合您的期望。 – sihrc

+0

整個// ...部分都有註釋代碼,所以我需要爲此調整我的正則表達式? – MasterGberry

+0

由於python不具有遞歸功能,因此無法使用一個正則表達式處理嵌套包。 –

回答

1

您應該使用re.DOTALL(== re.S)標誌。沒有此標誌,.與換行符不匹配。

re.DOTALL

充分利用 ''特殊字符匹配任何字符,包括 換行符;沒有這個標誌,'。'將匹配除換行符之外的任何內容。

import re 

with open('t.txt', 'r') as f: 
    contents = f.read() 

r = re.compile(r"Package\(\)\s*{(.+)\s*}", re.DOTALL) 
m = r.search(contents) 
inner_str = m.group(1) 
print inner_str 

你也可以指定標誌如下。見Regular expression syntax

r = re.compile(r"(?s)Package\(\)\s*{(.+)\s*}") 

注:不使用正則表達式打交道時直接相關的問題

  • 使用with open(..) as f而不是f = open(...) .... f.close()
  • 使用原始字符串(r'blah')。
+1

完美!這解決了我的問題。謝謝! – MasterGberry

-1

你有沒有嘗試過的正則表達式的字符串

"^\s*Package\(\)\s*{(.+)\s*}\s*$" 

這應該您正則表達式綁定到文件的開頭和結尾,它很可能你的代碼是目前在第一右括號結束。