簡體   English   中英

Python正則表達式多行匹配

[英]Python regex multi line matching

我必須在python中匹配多行。

group one start
line 1 data
group end
group two start
group two data
group end

在上面的字符串上如何獲得下面的輸出

[group one start \n line 1 data \n group end, group two start \n group two data \n group end]

我已經嘗試下面的代碼,但不能正常工作

import re 

re.findall(r'group.*start.*group end',re.MULTILINE | re.DOTALL)

for info in data:
   print info

也許,該表達式有點類似於:

\bgroup [\s\S]*? start\b[\s\S]*?\bgroup end\b

演示1

要么:

\bgroup .*? start\b.*?\bgroup end\b

演示2

帶有DOTALL標志的DOTALL可能在這里工作。

DOTALL測試:

import re

regex = r"\bgroup .*? start\b.*?\bgroup end\b"

test_str = """
group one start
line 1 data
group end
group two start
group two data
group end
"""

print(re.findall(regex, test_str, re.DOTALL))

不使用DOTALL測試:

import re

regex = r"(\bgroup [\s\S]*? start\b[\s\S]*?\bgroup end\b)"

test_str = """
group one start
line 1 data
group end
group two start
group two data
group end

"""


print(re.findall(regex, test_str))

輸出量

['group one start\nline 1 data\ngroup end', 'group two start\ngroup two data\ngroup end']

regex101.com右上角的面板上說明了該表達式,如果您希望對其進行探索/簡化/修改,並且在此鏈接中 ,您可以根據需要觀看它與某些示例輸入的匹配方式。

您可以根據模式group end拆分文本,而無需使用后向捕獲

>>> import re
>>> text_data = """group one start
... line 1 data
... group end
... group two start
... group two data
... group end"""
>>> 
>>> re.split(r'(?<=group end)\n', text_data)
['group one start\nline 1 data\ngroup end', 'group two start\ngroup two data\ngroup end']

下面的代碼為我工作

a = """group one start
line 1 data
group end
group two start
group two data
group end
"""
all_m = re.findall(r'group.*?start.*?group end',a,re.DOTALL)
for m in all_m:
    print(m)
    print("**********")

輸出量

group one start
line 1 data
group end
*************
group two start
group two data
group end
*************

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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