Python 3:使用 REGEX 搜索大型文本文件
Posted
技术标签:
【中文标题】Python 3:使用 REGEX 搜索大型文本文件【英文标题】:Python 3: Searching A Large Text File With REGEX 【发布时间】:2012-03-21 17:20:00 【问题描述】:我希望用正则表达式搜索一个大文本文件并设置了以下代码:
import re
regex = input("REGEX: ")
SearchFunction = re.compile(regex)
f = open('data','r', encoding='utf-8')
result = re.search(SearchFunction, f)
print(result.groups())
f.close()
当然,这不起作用,因为re.search
的第二个参数应该是字符串或缓冲区。但是,我无法将所有文本文件都插入到一个字符串中,因为它太长了(这意味着它需要很长时间)。有什么选择?
【问题讨论】:
Python regex parse stream的可能重复 假设您的文件在您的本地驱动器上并且它不大于您的可用内存,加载文件将比运行正则表达式花费更少的时间。你真的尝试过先阅读全文吗? @beerbajay,CPU 处理字符串的速度比 HDD 读取它们的速度要快。简单的表达式将比从磁盘读取它们运行得更快。 (除非您使用的是相当快的 SSD/RAID)。 你当然是对的;我的反应是“这将需要永远”。 【参考方案1】:您可以将内存映射文件与mmap 模块一起使用。把它想象成一个伪装成字符串的文件(或 StringIO 的反义词)。您可以在 Doug Hellman 的 Python Module of the Week article about mmap 中找到一个示例。
【讨论】:
【参考方案2】:您检查每行的模式是否匹配。这不会将整个文件加载到内存中:
for line in f:
result = re.search(SearchFunction, line)
【讨论】:
This then becomes my new code? 问题是:我的打印结果只是一个()
。将第 11 行更改为 print(result)
只会返回类似于 <_sre.SRE_Match object at 0x0000000002A73648>
的内容。第 11 行实际上应该是什么才能给出正确的结果?
或者如果文件是一个大的二进制文件(不是基于文本的行),您可以一次加载和正则表达式部分。
@Secator:这种逐行匹配正则表达式的方法存在问题。如果一个正则表达式匹配两行或多行怎么办?像这样的东西 - pastie.org/3511422(那个正则表达式是我以前制作的,你的代码在这种情况下肯定行不通)
@PushpakDagade Steven 的回答可以用在这种情况下。以上是关于Python 3:使用 REGEX 搜索大型文本文件的主要内容,如果未能解决你的问题,请参考以下文章