<分区> 分区>
我正在解析日志文件,其中包含有关许多作业的事件的行,这些作业由作业 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。
