模式匹配后在Python3中不使用FOR的情况下返回巨大文件的确切行

时间:2018-09-16 15:33:02

标签: regex python-3.5

我是Python的新手。我的问题是: 我想对一个大文件匹配一个模式,并从中返回匹配的行(而不仅仅是匹配的字符串)。我不希望有FOR循环,因为我的文件很大。我正在使用 mmap 读取文件。

Sample File

在上面的文件中,如果我搜索 bhuvi ,我应该得到2行, bhuvi bhuvi Kumar

我为此使用了re.findall(),但它只是返回子字符串,而不是整行。

有人可以建议我在这里可以做什么吗?

1 个答案:

答案 0 :(得分:1)

如果输入文件很大,则不能使用readlines,但什么也不能使用 阻止您循环读取一个行。

由于 file 对象是可迭代的,因此可以将循环编写为:

for line in fh:

并在循环内处理输入行的内容。

文件大小并不重要,因为您不会尝试一次读取所有行。

要检查行中是否存在字符串(bhuvi),请使用 re.search,而不是re.findall。 实际上,您不需要任何匹配项列表,足以找到 单个匹配(效果更快)。

下面有一个示例程序( Python 3.7 ),编写了包含您的代码行 字符串以及行号:

import re

cnt = 0
with open('input.txt') as fh:
    for line in fh:
        line = line.rstrip()
        cnt += 1
        if re.search('bhuvi', line):
            print(f'{cnt}: {line}')

请注意,我使用rstrip()删除了尾随的换行符。

在评论后编辑:

您写道要检查的文件巨大。因此存在以下风险 如果您尝试整个将其读取到计算机内存中,则该程序 内存不足。

在这种情况下,您将必须逐块读取文件,然后 分别在每个块中执行搜索。

还有可能出现一行包含您要查找的文本的行 部分读入一个块,其余读入下一个, 因此您必须采取一些措施来避免程序中出现这种情况。

另一方面,如果除了使用 mmap 别无选择, 尝试类似re.finditer(r'[^\n]*bhuvi[^\n]*', map)的方法,即创建 寻找以下内容的迭代器:

  1. \ n 以外的其他字符序列。
  2. 您的字符串。
  3. \ n 以外的其他字符序列。

通过这种方式,迭代器返回的match对象将与 整行,而不是单独输入字符串。