python 正則表示式貪婪模式與非貪婪模式原理、用法例項分析
本文例項講述了python 正則表示式貪婪模式與非貪婪模式原理、用法。分享給大家供大家參考,具體如下:
之前未接觸過正則表示式,今日看python網路爬蟲的原始碼,裡面一行正則表示式匹配的程式碼初看之下,不是很理解,程式碼如下:
myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)
“.*?”這種匹配方式,按理解應該是匹配任意字元0個或多個(re.S模式,“.”可以匹配“\n”),但是這個“?”總覺的在這兒是多餘的,既然不理解,就敲程式碼試試:
import re patern = re.compile('www\..*') match1 = patern.match("www.baidu.com") if match1: print(match1.group()) else: print("match1 don't match") #output >>> ==================RESTART ============================= >>> www.baidu.com
這個結果,應該說是意料之中,加個“?”呢?
import re patern = re.compile('www\..*?') match1 = patern.match("www.baidu.com") if match1: print(match1.group()) else: print("match1 don't match") #output >>> ==================RESTART ============================= >>> www.
竟然是這個結果。。。“.?”一個字元都沒匹配,按“.”、“”、“?”的匹配理解,也就是“*”“?”均匹配前面字元0次,才會是這個結果,可是為啥就是0次了?
這就是正則表示式貪婪模式和非貪婪模式:
- 貪婪模式,總是嘗試匹配儘可能多的字元;
- 非貪婪模式則相反,總是嘗試匹配儘可能少的字元。
Python裡數量詞預設是貪婪的,這就解釋了第一個匹配實驗,輸出結果為”www.baidu.com”(貪婪模式),也就是說第二個匹配實驗是非貪婪模式,僅僅因為加了“?”,繼續實驗
import re patern = re.compile('www\..?') match1 = patern.match("www.baidu.com") if match1: print(match1.group()) else: print("match1 don't match") #output >>> ==================RESTART ============================= >>> www.b
此次匹配結果,顯然是貪婪模式。奇怪了,也就是“?”的特殊組合才是非貪婪模式。
網上搜索得如下說明:
標準量詞修飾的子表示式,在可匹配可不匹配的情況下,總會先嚐試進行匹配,稱這種方式為匹配優先,或者貪婪模式。此前介紹的一些量詞,“{m}”、“{m,n}”、“{m,}”、“?”、“*”和“+”都是匹配優先的。
一些NFA正則引擎支援忽略優先量詞,也就是在標準量詞後加一個“?”,此時,在可匹配可不匹配的情況下,總會先忽略匹配,只有在由忽略優先量詞修飾的子表示式,必須進行匹配才能使整個表示式匹配成功時,才會進行匹配,稱這種方式為忽略優先,或者非貪婪模式。忽略優先量詞包括“{m}?”、“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。
顯然“*?”的組合是非貪婪模式,猜想正確,原來如此啊。
PS:這裡再為大家提供2款非常方便的正則表示式工具供大家參考使用:
JavaScript正則表示式線上測試工具:
http://tools.jb51.net/regex/javascript
正則表示式線上生成工具:
http://tools.jb51.net/regex/create_reg
更多關於Python相關內容可檢視本站專題:《Python正則表示式用法總結》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》
希望本文所述對大家Python程式設計有所幫助。