这是另一种解决方案,使用内部文本缓冲区逐步产生找到的匹配项,而无需将整个文件加载到内存中。
这个缓冲区就像文件文本中的“滑动窗口”一样,向前移动,同时产生找到的匹配项。
由于文件内容是按块加载的,这意味着该解决方案也适用于多行正则表达式。
def find_chunked(fileobj, regex, *, chunk_size=4096):
buffer = ""
while 1:
text = fileobj.read(chunk_size)
buffer += text
matches = list(regex.finditer(buffer))
# End of file, search through remaining final buffer and exit
if not text:
yield from matches
break
# Yield found matches except the last one which is maybe
# incomplete because of the chunk cut (think about '.*')
if len(matches) > 1:
end = matches[-2].end()
buffer = buffer[end:]
yield from matches[:-1]
但是,请注意,如果根本找不到匹配项,它可能最终将整个文件加载到内存中,因此如果您确信您的文件多次包含正则表达式模式,则最好使用此功能。