问题描述
我是 Python 的新手。 我的问题是:我想将一个模式与一个大文件进行匹配,并从中返回匹配的行(不仅仅是匹配的字符串)。 我不想为此使用 FOR 循环,因为我的文件很大。 我正在使用mmap来读取文件。
在上面的文件中,如果我搜索bhuvi ,我应该得到 2 行, bhuvi和bhuvi Kumar
我为此使用了 re.findall(),但它只返回子字符串,而不是整行。
有人可以建议我在这里做什么吗?
1楼
    如果输入文件是巨大的,你不能使用readlines ,但没有阻止你读一行在一个循环。
由于文件对象是可迭代的,您可以将循环编写为:
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) ,即创建一个迭代器寻找:
- 除\\n之外的字符序列。
- 你的字符串。
- 除\\n之外的另一个字符序列。
这样迭代器返回的匹配对象将匹配整行,而不是单独的字符串。