re.match returns python 内存错误

re.match returns memory error in python

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]*)*?\#',没有给出错误。为什么会发生这种情况以及可行的解决方案是什么。 谢谢。

如果你想匹配“#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 块中,则需要保持状态。