Python:跨文件 block 边界的正则表达式匹配

标签 python regex boundary

巨大的纯文本数据文件

我使用 python 分块读取了一个巨大的文件。然后我对该 block 应用正则表达式。基于一个标识符标签,我想提取相应的值。由于 block 大小,数据在 block 边界处丢失。

要求:

  • 文件必须分块读取。
  • block 大小必须小于 或等于 1 GiB。


Python代码示例

identifier_pattern = re.compile(r'Identifier: (.*?)\n')
with open('huge_file', 'r') as f:
    data_chunk = f.read(1024*1024*1024)
    m = re.findall(identifier_pattern, data_chunk)


block 数据示例

标签数量等于值数量

Identifier: value
Identifier: value
Identifier: value
Identifier: value


由于 block 的大小,您会遇到如下所列的各种边界问题。第三个标识符返回一个不完整的值,“v”而不是“value”。下一个 block 包含“alue”。这会导致解析后丢失数据。

差:标识符值不完整

Identifier: value
Identifier: value
Identifier: v


你如何解决这样的 block 边界问题?

最佳答案

假设这是您的确切问题,您可能只需调整正则表达式并逐行读取(这不会将完整文件加载到内存中):

import re
matches = []
identifier_pattern = re.compile(r'Identifier: (.*?)$')
with open('huge_file') as f:
    for line in f:
        matches += re.findall(identifier_pattern, line)

print("matches", matches)

关于Python:跨文件 block 边界的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44212183/

相关文章:

gps - 如何将应用程序的可用性限制在某个地理区域 ANDROID

GIT_DISCOVERY_ACROSS_FILESYSTEM 未设置

python - 异步抓取并使用django celery和redis存储结果并存储我的正确方法是什么?

python - 我在哪里调用 Keras 中的 BatchNormalization 函数?

Python 字典更新和细化循环

java - 在 String 中使用 ReplaceAll 时出现正则表达式异常

c++ - 转义 tr1::regex 的正则表达式特殊字符

python - 使用字典值时的字符串格式问题

regex - Perl 正则表达式——使用 eval 进行动态替换,替换中使用文字 $1

javascript - 通过边界检测重复形状 - html5、canvas、javascript