我正在解析量子化学软件的大输出(25 MB provided 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”并一直运行到最后一个“结束”,捕捉到介于两者之间的所有内容。

所以,在浪费整个星期天试图弄清楚这一点之后,伙计们,我正在征求您的意见。如何仅从每个NEVPT2部分获得位?

最佳答案

你可以用

^NEVPT2.+?^end


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

10-07 22:29