Python初學者筆記(四):白話講正則的「貪婪與懶惰」,你看不懂算我笨!

什麼是正則(規則)的「貪婪與懶惰」?每當入門的小白看到新術語,就會上火,在說什麼啊?完全聽不懂,能不能先舉個生活化例子?別急,先免費給你和懶漢王二小每人一個發財的機會,看到下面的金條了嗎?因為上面有黑點成了廢品,但是還是值很多錢,現在可以把兩個黑點之間的金條白送給你。

王二小是個懶漢,看到A和B是兩個黑點,就切了一小塊金字。

可你一看,A和E也符合「兩個黑點之間」的條件,所以你就要了A和E中間的一大塊金子,所以你就發財了。

貪婪模式:就是在條件允許的前提下,儘可能找更長的金條。

懶惰模式:就是在條件允許的前提下,找到第一段符合條件的金條就行,你說有多懶吧。

現在,大概原理我們懂了,接下來看看代碼,是不是這樣執行的。

以「*」星號為例,它就是貪婪模式的代表,

而「*?」就是懶惰模式的代表。

下面開始讓它們幹活了,運行下面的程序。先有一個叫demotext的字元串,你就當是村裡的人員名單。我們的兩個員工開始幹活,一個叫貪婪tanlan,一個叫懶惰landuo,工作內容是從頭找到「張字開頭,李字結尾」的內容。

import re demotext = 張三李四王二麻子張三的爹李四的爹王二麻子的爹 tanlan = re.match(張.*李, demotext) landuo = re.match(張.*?李, demotext) print(tanlan) print(landuo)

執行結果如下:

<_sre.SRE_Match object; span=(0, 13), match=張三李四王二麻子張三的爹李> <_sre.SRE_Match object; span=(0, 3), match=張三李>

勤勞的貪婪找到了好長一根,並且符合條件「張字開頭,李字結尾」。而懶惰只找到了三個字,勉強完成任務了。

這就是兩種模式的對比,那是不是懶惰一定不勤勞呢?還要看你這個老闆的命令,剛才我們用的命令是macth,就是比較,現在我們再換個命令,findall,就是「在大字元串demotext內找到全部符合條件的結果」,再看一下是什麼結果。

import re demotext = 張三李四王二麻子張三的爹李四的爹王二麻子的爹 tanlan = re.findall(張.*李, demotext) landuo = re.findall(張.*?李, demotext) print(tanlan) print(landuo)

輸出結果:

[張三李四王二麻子張三的爹李] [張三李, 張三的爹李]

看到沒,因為查找命令不同,懶惰還是找到了兩段,反而比貪婪還多幹了不少活。

那麼在實際應用中,應該使用哪種模式呢?

對於一些簡單的需求,比如「A<div>B</div>C」,想得到div標籤中間的內容B,使用兩種模式都可以。相對來說,我們要找的內容大多是懶惰模式找到的固定內容,而貪婪模式的內容通常並不是我們所需要的。只能根據實際需要來做選擇了。

推薦閱讀:

R語言第二戰之朝陽醫院銷售數據解密
c++入門真的真的零基礎求幫助可以嗎?
Scalers:學習入門太擁擠,請往裡走,裡面人少車空
外匯投資入門需要些什麼?
2分鐘爬進葡萄酒窗戶

TAG:Python | 入门指南 | 贪婪 |