一次查找 512 个字节的模式并打印匹配项。
Looking for a Pattern 512 bytes at a time and printing match.
我需要在一个非常大的日志文件(几 GB)中找到与特定模式匹配的字符串。问题是我一次只能查看 512 字节的文件。当我一次比较 512 个字节的字符串时,并不总能找到模式,因为它可能会重叠两个不同的块。例如,如果模式是 "potato",则单词的第一部分可能仅存在于一个块的末尾,而其余部分仅存在于第二个块的开头。
理想情况下,我想用正则表达式替换模式,并且只打印模式匹配的字符串。我很想看看其他人会如何处理这样的问题。任何帮助将不胜感激。
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 个连续读取中匹配不止一次)。我只保留模式的长度,如果它是 real 正则表达式,这可能是错误的。
然后,如果找到匹配项,只需打印第一个也是唯一一个组,如下所示:
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 个字节)
获取第一个 512 字节的块。得到第二个。加入第二个的第一个+长度(模式)字节。在这个连接的块中寻找你的模式。
得到第三个。加入第三个的整个第二个+长度(模式)字节。寻找模式。出块等
我需要在一个非常大的日志文件(几 GB)中找到与特定模式匹配的字符串。问题是我一次只能查看 512 字节的文件。当我一次比较 512 个字节的字符串时,并不总能找到模式,因为它可能会重叠两个不同的块。例如,如果模式是 "potato",则单词的第一部分可能仅存在于一个块的末尾,而其余部分仅存在于第二个块的开头。
理想情况下,我想用正则表达式替换模式,并且只打印模式匹配的字符串。我很想看看其他人会如何处理这样的问题。任何帮助将不胜感激。
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 个连续读取中匹配不止一次)。我只保留模式的长度,如果它是 real 正则表达式,这可能是错误的。
然后,如果找到匹配项,只需打印第一个也是唯一一个组,如下所示:
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 个字节)
获取第一个 512 字节的块。得到第二个。加入第二个的第一个+长度(模式)字节。在这个连接的块中寻找你的模式。
得到第三个。加入第三个的整个第二个+长度(模式)字节。寻找模式。出块等