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 块中,则需要保持状态。
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 块中,则需要保持状态。