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 搜索大型文本文件的主要内容,如果未能解决你的问题,请参考以下文章

python_regex

使用 python 生成器处理大型文本文件

Python RegEx

Python RegEx

如何对大文本文件运行字典搜索?

在 pandas 数据框中搜索和替换大型数据集