簡體   English   中英

Python中的正則表達式:從文本中提取具有重復相似版本的多行部分

[英]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-FXYtime部分之間包含貪婪的 .* 因此,它吃掉了最后一組的所有食物。

在這里使用非貪婪版本應該足夠了:

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.

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