我正在解析一个量子化学软件的大输出(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节获取位
作为一种替代方法,您可以匹配开始
^NEVPT2.*\n
处的行,并使用多行标志继续匹配所有不以end开头的行,使用负的lookahead(?!end$)
Regex demo| Python demo
例如
你可以用
在
single
和multiline
模式下,请参见a demo on regex101.com相关问题 更多 >
编程相关推荐