大文件上的Python多行正则表达式,不缓冲整个文件

2024-10-04 01:36:14 发布

您现在位置:Python中文网/ 问答频道 /正文

Python中对大文件执行多行正则表达式搜索的最快方法是什么

我通常看到:

  1. 使用for line in file。这不适用于多行正则表达式
  2. 缓冲整个文件,例如text = file.read()。这不会扩展到非常大的文件

我正在寻找某种方法将数据从文件直接流式传输到已编译的正则表达式

确切用例: 我试图在saif文件中找到所有TC值和信号的名称(仅最后一个级别可以,不需要完整的层次名称)。例如,我正在寻找的模式是

(signalname\[14\]
  (T0 5519100) (T1 12540900) (TX 0)
  (TC 5) (IG 0)
)

据我所知,空格可以与任何空格互换。 该模式包含在其他块中,我不再关心这些。 我特别关心TC值和名称(带有可选索引)。 似乎与pcregrep -M一起工作的正则表达式是\(\s*([0-9a-zA-Z_]*(?:\\\[[0-9]+\\\])?)\s*\(\s*T0\s*[0-9]+\s*\)\s*\(\s*T1\s*[0-9]+\s*\)\s*\(\s*TX\s*[0-9]+\s*\)\s*\(\s*TC\s*([0-9]+)\s*\)\s*\(\s*IG\s*[0-9]+\s*\)\s*\)。看看pcregrep的内存使用情况,它似乎是以流方式运行的,因此可以做我想要的事情。我正在寻找一种python方法来实现这一点


Tags: 文件方法名称forline模式filetc
1条回答
网友
1楼 · 发布于 2024-10-04 01:36:14

您可以将每一行连接成一个“buffer”字符串,并在正则表达式匹配时将其清除

例:

buffer = line1line1line1line1\nline2line2line2line2
         | - - - - Regex Match - - - - - |
buffer = line2line2

字符串连接可能很慢,尤其是对于大字符串,请参见:https://waymoot.org/home/python_string/

相关问题 更多 >