Skip to main content
 首页 » 编程设计

python之使用正则表达式匹配 Python 中两个模式之间的行

2024年08月14日40Leo_wl

<分区>

我正在解析日志文件,其中包含有关许多作业的事件的行,这些作业由作业 ID 标识。我试图在 Python 的两种模式之间获取日志文件中的所有行。

我已经阅读了这篇非常有用的帖子 How to select lines between two patterns?并且已经像这样用 awk 解决了这个问题:

awk '/pattern1/,/pattern2/' file 

由于我在 Python 脚本中处理日志信息,因此我使用 subprocess.Popen() 来执行该 awk 命令。我的程序可以运行,但我想单独使用 Python 来解决这个问题。

我知道 re 模块,但不太了解如何使用它。日志文件已经被压缩为 bz2,所以这是我打开 .bz2 文件并找到两个模式之间的行的代码:

import bz2 
import re 
 
logfile = '/some/log/file.bz2' 
 
PATTERN = r"/{0}/,/{1}/".format('pattern1', 'pattern2') 
# example: PATTERN = r"/0001.server;Considering job to run/,/0040;pbs_sched;Job;0001.server/" 
re.compile(PATTERN) 
 
with bz2.BZ2File(logfile) as fh: 
    match = re.findall(PATTERN, fh.read()) 

但是,match 是空的(fh.read() 不是!)。使用 re.findall(PATTERN, fh.read(), re.MULTILINE) 无效。 在 re.compile() 之后使用 re.DEBUG 显示多行

literal 47 
literal 50 
literal 48 
literal 49 
literal 57 

还有两个说

any None 

我可以用这里的循环解决问题 python print between two patterns, including lines containing patterns但我尽可能避免嵌套的 for-if 循环。我相信 re 模块可以产生我想要的结果,但我不是如何使用它的专家。

我正在使用 Python 2.7.9。