[英]Regex in Python: extract a multiline part from a text with repeating similar editions
先謝謝您的幫助。 我正在使用Python正則表達式從具有以下布局的文本中提取部分:
(A lot of information)
time: 150
C-FXY
-- information ---
E-END
(A lot of information)
time: 5000
C-FXY
**--- INFORMATION I WANT TO EXTRACT ---**
E-END
(A lot of information)
time: 13000
C-FXY
-- information ---
E-END
(A lot of information)
我需要從對應於5000的時間步中提取C-FXY和E-END之間的所有內容。為此,我正在使用以下Python 3.6語句:
time_step = '5000'
text_part = re.search(r'time.*'+time_step+'.*C-FXY(.*?)E-END', text, re.DOTALL).group(1)
不幸的是,我得到的輸出是C-FXY和E-END之間的同一版本,但從文本的13000時間步開始,而不是我希望的時間:5000。
任何幫助將非常感激。 :)
引起該錯誤的原因是,您的正則表達式在time
部分和C-FXY
的time
部分之間包含貪婪的 .*
。 因此,它吃掉了最后一組的所有食物。
在這里使用非貪婪版本應該足夠了:
text_part = re.search(r'time.*'+time_step+'.*?C-FXY(.*?)E-END', text, re.DOTALL).group(1)
無論如何,我不會在這里使用整個文件的多行搜索,但是我會逐行讀取文件,直到time: 5000
,然后是C-FXY
,然后從那里存儲任何內容到C-END
一個,然后在那里結束處理。
您可以使用以下代碼解決它:
import re
text = """(A lot of information)
time: 150
C-FXY
-- information ---
E-END
(A lot of information)
time: 5000
C-FXY
**--- INFORMATION I WANT TO EXTRACT ---**
E-END
(A lot of information)
time: 13000
C-FXY
-- information ---
E-END
(A lot of information)"""
pattern = re.compile(r"C-FXY(.*?)E-END")
results = re.findall(r"C-FXY(.*?)E-END", text, re.DOTALL)
現在,如果您打印results
:
for i, r in enumerate(results):
print(f"Resultado {i}:\n'{r}'")
輸出為:
Resultado 0:
'
-- information ---
'
Resultado 1:
'
**--- INFORMATION I WANT TO EXTRACT ---**
'
Resultado 2:
'
-- information ---
'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.