正則表達式中貪婪模式和非貪婪模式(Python3.6)

原文鏈接:https://blog.csdn.net/m0_37852369/article/details/79101892

一、概念
貪婪模式:正則表達式一般趨於最大長度匹配,也就是所謂的貪婪匹配。
非貪婪模式:在整個表達式成功的前提下,儘可能少的匹配。
舉個栗子:

>>> content = "abbbbbbbbbbbbbbbsa"
>>> res = re.compile("ab+")
>>> res.findall(content)	#貪婪模式
['abbbbbbbbbbbbbbb']
>>> res = re.compile("ab+?")#非貪婪模式
>>> res.findall(content)
['ab']

二、使用方法
在python中默認使用貪婪模式。使用非貪婪模式要在量詞後直接加上英文符號"?"。
正則表達式中量詞一共五中:

* 允許當前一個字符可以出現0或無限次
+ 前一個字符至少出現1次
? 前一個字符只能出現一次或者不出現
{m} 允許前一個字符只出現m次
{m,} 允許前一個字符最少出現m次
{m,n} 允許前一個字符至少出現m次,最多出現n次(閉區間)

三、原理分析
在正則表達式中一般默認採用的是貪婪模式,在上面的例子當中已經匹配到了"ab"時已經可以使整個表達式匹配成功,但是採用的是貪婪模式,所以還需要往後繼續匹配,檢查時存在更長的可以可以匹配成功的字符串。一直匹配到最後一個"b"時,後面已經沒有可以成功匹配的字符串就匹配結束。返回匹配結果"abbbbbbbbbbbbbbb"。
所以我們可以將貪婪模式理解爲:在整個表達式匹配成功的前提下,儘可能多的匹配。

非貪婪模式也就是將我們栗子中的正則表達式"ab+“改爲"ab+?”,當匹配到"ab"時,已經匹配成功,直接結束匹配,不再向後繼續嘗試,返回匹配成功的字符串"ab"。
所以我們可以將非貪婪模式理解爲:在整個表達式匹配成功的前提下,儘可能少的匹配。
四、舉個實例

>>> example = "<div>這是文本1</div><div>這是文本2</div>"
>>> greed = re.compile("<div>.*</div>")
>>> notgreed = re.compile("<div>.*?</div>")
>>> greedResult = greed.search(example)
>>> notgreedResult = notgreed.search(example)
>>> greedResult
<_sre.SRE_Match object; span=(0, 32), match='<div>這是文本1</div><div>這是文本2</div>'>
>>> notgreedResult
<_sre.SRE_Match object; span=(0, 16), match='<div>這是文本1</div>'>

五、總結
1.從應用角度看
貪婪與非貪婪模式影響的是被量詞修飾的子表達式的匹配行爲。貪婪模式在這整個表達式匹配成功前提下,儘可能多的匹配;而非貪婪模式在整個表達式匹配成功的前提下,儘可能少的匹配。
2.從匹配原理角度看
能達到同樣匹配結果的貪婪與非貪婪模式,通常是貪婪模式的匹配效率比較高。所有的非貪婪模式,都可以通過修改量詞的子表達式,轉換爲貪婪模式。貪婪模式可以與固化分組結合,提升匹配效率,而非貪婪模式不可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章