簡體   English   中英

RegEx - 如何僅獲取在大輸出中重復的多行文本塊?

[英]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.+?^end

singlemultiline模式下,請參閱regex101.com 上的演示

作為替代方案,您可以匹配開頭的行^NEVPT2.*\\n並使用多行標志繼續匹配所有不以 end 開頭的行,使用負前瞻(?!end$)

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

正則表達式演示| Python 演示

例如

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM