2016-03-15 61 views
0
def name(): 

    with open('newfile.txt') as f: 
     lineno = f.readlines() 

    for line in lineno: 
     h = re.compile('(#DESIGNATION\ \:[\n\t]*)((.)*[\n\t]*)*?\#') 
     print h.match(line) 

name() 

newfile.txt包含大約100行。運行該程序時出現錯誤MemoryError。去除?從'(#DESIGNATION\ \:[\n\t]*)((.)*[\n\t]*)*?\#',沒有錯誤。爲什麼會發生這種情況,以及可行的解決方案 謝謝。re.match在python中返回內存錯誤

+1

嘗試移動環路 –

+0

回溯的'H = re.compile(...)'外(最新最後調用): 文件 「insert.py」 38行,在 名() 文件「insert.py」,第33行,名稱爲 print h.match(line) MemoryError –

+0

@BrentWashburne未解決。仍然是相同的錯誤 –

回答

1

如果您想匹配「#DESIGNATION:」,後面跟着一些行,後面跟着一個帶有「#」的行,您首先需要將文本作爲單個字符串讀取,並使用re.MULTILINE來匹配它。這裏有一個例子:

import re 

text = ''' 
cat 
mouse 
#DESIGNATION : horse 
dog 
bird 
lake 
# 
ocean 
sea 
#DESIGNATION : bike 
box 
table 
# 
nothing 
something 
''' 

h = re.compile('^#DESIGNATION :(?:[^\n]|\n[^#])*\n#', re.MULTILINE) 
matches = re.findall(h, text) 
print repr(matches) 

其輸出

['#DESIGNATION : horse\ndog\nbird\nlake\n#', '#DESIGNATION : bike\nbox\ntable\n#'] 

請注意,我用(?:)匹配運營商在這裏組正則表達式在一起,而在每次評估時間捕捉它們匹配的文本。

對於較大的文件,您可能不希望一次重新匹配整個文本正文,而是重複遍歷行。但是,如果你這樣做,你不能在表達式中使用'\ n',因爲你一次只能使用一行代碼。相反,如果您處於#DESIGNATION塊中,您需要保持狀態。