一次寻找一个512字节的模式并打印匹配。

时间:2016-11-20 19:50:14

标签: python regex full-text-search

我需要找到一个与非常大的日志文件(几GB)中的特定模式匹配的字符串。问题是我一次只能查看512字节的文件。当我一次比较字符串512字节时,并不总是找到该模式,因为它可能会重叠两个不同的块。例如,如果模式是“马铃薯”,则单词的第一部分可能仅存在于一个块的末尾,而其余部分仅存在于第二个块的开头。

理想情况下,我想用模式替换正则表达式,只打印模式匹配的字符串。我很想知道其他人会如何解决这样的问题。任何帮助将不胜感激。

import sys
import re

file = open(sys.argv[1], "rb")
pattern = re.compile('potato')

try:
    chunk= file.read(512)
    while byte != "":
        if pattern.search(chunk):
            print chunk
            # TODO: Print only the part that matched pattern
        chunk = file.read(100)
finally:
    file.close()

2 个答案:

答案 0 :(得分:1)

首先,使用括号创建一个组。

读取块,并匹配前一个块+块的一部分(不是两个块,因为在两次连续读取时你会匹配多次)。我只保留模式的长度,如果它是真正的正则表达式,这可能是错误的。

然后,如果找到匹配项,只需打印第一个也是唯一一个组,如下所示:

file = open(sys.argv[1], "rb")
ptrn="potato"
pattern = re.compile('({})'.format(ptrn),re.DOTALL)  # group & multi-line match

prev=""
try:
    while True:
        chunk= file.read(512)
        if not chunk:
           break
        m = pattern.search(prev+chunk)
        if m:
            # Print only the part that matched pattern
            print(m.group(1))
        prev = chunk[-len(ptrn):]   # keep end of previous chunk
finally:
    file.close()

注意:

  • 由于您在阅读时遇到行尾而不是逐行阅读,我建议使用re.DOTALL标记进行多行匹配
  • while条件可能存在拼写错误。你可能意味着chunk而不是bytes。我已经修复了这个并简化了读取循环(并且你继续读取100个字节而不是512个)

答案 1 :(得分:1)

获取第一个512字节块。得到第二个。加入第二个的第一个+长度(模式)字节。在这个连接的chunck中寻找你的模式。

获得第三个。加入第三个的第二个+长度(模式)字节。寻找模式。获得大块等等。