RegEx如何只获取在大输出中重复的多行文本块?

2024-10-01 22:28:37 发布

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

我正在解析一个量子化学软件的大输出(25mbprovided here)。软件使用两种方法执行计算:CASSCF和NEVPT2。每种方法执行相同的计算,导致不同的结果。实际上,我已经将脚本设置为针对不同的配置多次运行计算,因此我最终有了如下组织:

JOB 1
CASSCF RESULTS
***
Lots of text
***
end
NEVPT2 RESULTS
***
Lots of text
***
end

JOB 2
CASSCF RESULTS
***
Lots of text
***
end
NEVPT2 RESULTS
***
Lots of text
***
end
………………
JOB 31
CASSCF RESULTS
***
Lots of text
***
end
NEVPT2 RESULTS
***
Lots of text
***
end

我只想要NEVPT2结果,我已经将正则表达式设置为这个(应用于实际输出(我上面的示例只是为了展示组织):

NEVPT2_Section = r"(?:AILFT MATRIX ELEMENTS \(NEVPT2\)\n-+\n\n)([\s\S]*)(?:\n\n--------------\nCASSCF TIMINGS)"
NEVPT2_Section_mathes = re.finditer(NEVPT2_Section, inp_content, re.MULTILINE)

for xyz in NEVPT2_Section_mathes:
    my_xyz = xyz.group(1)
    print(my_xyz)

如果我正在处理一个只有一个作业的文件,它可以正常工作,从“NEVPT2 RESULTS”开始,在第一个“end”处停止,但是,多作业文件会找到第一个“NEVPT2 RESULTS”,并一直持续到最后一个“end”,捕获中间的所有内容

所以,在浪费了整个星期天的时间想弄明白这件事之后,我想听听你们的建议,伙计们。如何仅从每个NEVPT2节获取位


Tags: of方法textre软件myjobsection
2条回答

作为一种替代方法,您可以匹配开始^NEVPT2.*\n处的行,并使用多行标志继续匹配所有不以end开头的行,使用负的lookahead (?!end$)

^NEVPT2.*\n(?:(?!end$).*\n)*end$

Regex demo| Python demo

例如

NEVPT2_Section = r"^NEVPT2.*\n(?:(?!end$).*\n)*end$"
NEVPT2_Section_mathes = re.finditer(NEVPT2_Section, inp_content, re.MULTILINE)

for xyz in NEVPT2_Section_mathes:
    print(xyz.group())

你可以用

^NEVPT2.+?^end

singlemultiline模式下,请参见a demo on regex101.com

相关问题 更多 >

    热门问题