re.match在python中返回内存错误

时间:2016-03-15 20:07:51

标签: python out-of-memory

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行。运行此程序时会出错[{1}}。去除?来自MemoryError',没有错误。为什么会发生这种情况,什么是可行的解决方案。 感谢。

1 个答案:

答案 0 :(得分: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块中,则需要保持状态。