[英]RegEx - How to get only a multiline block of text that repeats in a large output?
我正在解析來自量子化學軟件的大量輸出( 此處提供25 MB)。 該軟件使用兩種方法執行計算: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”開始並在第一個“結束”處停止,但是,多作業文件找到第一個“NEVPT2 RESULTS”並繼續運行,直到最后一個“結束”,捕捉兩者之間的一切。
所以,在浪費了整個星期天試圖弄清楚這一點之后,我在尋求你們的建議,伙計們。 如何僅從每個 NEVPT2 部分獲取位?
作為替代方案,您可以匹配開頭的行^NEVPT2.*\\n
並使用多行標志繼續匹配所有不以 end 開頭的行,使用負前瞻(?!end$)
。
^NEVPT2.*\n(?:(?!end$).*\n)*end$
例如
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())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.