1. 程式人生 > 其它 >盤點Python正則表示式中的貪婪模式和非貪婪模式

盤點Python正則表示式中的貪婪模式和非貪婪模式

大家好,我是我是皮皮。

一、前言

前幾天在Python最強王者交流群有個叫【傑】的粉絲問了一個關於Python正則表示式的問題,其中涉及到Python正則表示式中的貪婪模式和非貪婪模式,討論十分火熱,這裡拿出來給大家分享下,一起學習。

二、解決過程

這裡分享【小王】大佬的解答,一起來看看吧,下面是他給的一個示例程式碼。

import re

txt = "This is an HTML tag: <head>HEADER</head>. It means the head of the whole HTML document."
pattern1 = re.compile(r"<.*>")
pattern2 = re.compile(r"<.*?>")
result1 = re.findall(pattern1, txt)
result2 = re.findall(pattern2, txt)
print(result1)
print(result2)

輸出結果如下圖所示:

關於輸出的解析如下:

我想匹配HTML標籤中的資料,也就是<>之間的資料。

pattern1 = re.compile(r"<.*>")
pattern2 = re.compile(r"<.*?>")

這兩種只相差了一個?,但是區別卻很大。解析如下圖所示:

直到什麼時候停止呢?

這個就是貪婪模式的匹配方式,那麼非貪婪模式呢?

小彩蛋

分享一個【小王】大佬的程式碼,實現的效果是將正則匹配結果寫成命名分組Python程式碼。

常規寫法如下所示:

import re

txt = "This is an HTML tag: <head>HEADER</head>. It means the head of the whole HTML document."

tag = re.compile(r"<([A-Za-z0-9]+)>.*?</\1>.*")
print(re.findall(tag, txt))

寫成命名分組的寫法如下所示:

txt = "This is an HTML tag: <head>HEADER</head>. It means the head of the whole HTML document."

tag = re.compile(r"<(?P<tag_mark>[A-Za-z0-9]+)>.*?</(?P=tag_mark)>.*")
print(re.findall(tag, txt))

總結

大家好,我是皮皮。這篇文章基於粉絲提問,針對Python正則表示式中的貪婪模式和非貪婪模式問題,給出了具體說明和演示,順利的幫助粉絲解決了問題。

最後感謝粉絲【傑】提問,感謝【小王】大佬給出的解答和示例,感謝【(這是月亮的背面)】、【dcpeng】、【wangning】、【Chloé P.】等大佬們參與學習交流。

小夥伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學習交流群共同探討學習。