我希望能够在整个文件上运行正则表达式,但我希望能够不必立即将整个文件读入内存,因为将来可能会使用相当大的文件.有没有办法做到这一点?谢谢!
澄清:我无法逐行阅读,因为它可以跨越多行.
您可以使用mmap将文件映射到内存.然后可以像普通字符串一样访问文件内容:
import re, mmap with open('/var/log/error.log', 'r+') as f: data = mmap.mmap(f.fileno(), 0) mo = re.search('error: (.*)', data) if mo: print "found error", mo.group(1)
这也适用于大文件,文件内容根据需要从磁盘内部加载.
这取决于文件和正则表达式.您可以做的最好的事情是逐行读取文件,但如果这对您的情况不起作用,则可能会因将整个文件拉入内存而陷入困境.
让我们说例如这是你的文件:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fringilla pede blandit eros sagittis viverra. Curabitur facilisis urna ABC elementum lacus molestie aliquet. Vestibulum lobortis semper risus. Etiam sollicitudin. Vivamus posuere mauris eu nulla. Nunc nisi. Curabitur fringilla fringilla elit. Nullam feugiat, metus et suscipit fermentum, mauris ipsum blandit purus, non vehicula purus felis sit amet tortor. Vestibulum odio. Mauris dapibus ultricies metus. Cras XYZ eu lectus. Cras elit turpis, ultrices nec, commodo eu, sodales non, erat. Quisque accumsan, nunc nec porttitor vulputate, erat dolor suscipit quam, a tristique justo turpis at erat.
这是你的正则表达式:
consectetur(?=\sadipiscing)
现在这个正则表达式使用正向前瞻,并且只会匹配一串"consectetur",如果它后面紧跟任何空白字符,然后是一串"adipiscing".
因此,在此示例中,您必须将整个文件读入内存,因为正则表达式取决于整个文件被解析为单个字符串.这是许多示例中需要您将整个字符串保留在内存中以使特定正则表达式工作的示例之一.
我想不幸的答案是,这一切都取决于你的情况.