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

标签 python regex full-text-search

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

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

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()

最佳答案

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

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

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

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 条件中可能存在拼写错误。您可能指的是 block 而不是字节。我已经修复了这个问题并简化了读取循环(而且您继续读取 100 个字节而不是 512 个字节)

关于python - 一次寻找 512 字节的模式并打印匹配。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40708646/

相关文章:

python - python套接字服务器在发送数据后挂起

javascript - 段落中某个单词的正则表达式

python - 如何将每一行的第一列数据添加到相应行中由某些特定字符串或字符标记的每一列的标题?

sql - Oracle SQL - 编辑自由文本叙述中除最后四位数字之外的所有不同长度数字的多个出现

full-text-search - 全文搜索 indexeddb,示例实现

python - 如何在python中获得高斯滤波器

python - 从多项式回归(图)获取函数 ("f(x)")

mysql - 全文搜索相关性是用什么来衡量的?

python - 如何在Python中找到重复的字符串段?

sql-server - 使用 FTS 进行搜索相对于在索引列上使用 LIKE 进行搜索的性能有何提升)?