python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法實(shí)例分析
本文實(shí)例講述了python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法。分享給大家供大家參考,具體如下:
之前未接觸過(guò)正則表達(dá)式,今日看python網(wǎng)絡(luò)爬蟲的源碼,里面一行正則表達(dá)式匹配的代碼初看之下,不是很理解,代碼如下:
myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)
“.*?”這種匹配方式,按理解應(yīng)該是匹配任意字符0個(gè)或多個(gè)(re.S模式,“.”可以匹配“\n”),但是這個(gè)“?”總覺的在這兒是多余的,既然不理解,就敲代碼試試:
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
這個(gè)結(jié)果,應(yīng)該說(shuō)是意料之中,加個(gè)“?”呢?
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.
竟然是這個(gè)結(jié)果。。?!??”一個(gè)字符都沒(méi)匹配,按“.”、“”、“?”的匹配理解,也就是“*”“?”均匹配前面字符0次,才會(huì)是這個(gè)結(jié)果,可是為啥就是0次了?
這就是正則表達(dá)式貪婪模式和非貪婪模式:
- 貪婪模式,總是嘗試匹配盡可能多的字符;
- 非貪婪模式則相反,總是嘗試匹配盡可能少的字符。
Python里數(shù)量詞默認(rèn)是貪婪的,這就解釋了第一個(gè)匹配實(shí)驗(yàn),輸出結(jié)果為”www.baidu.com”(貪婪模式),也就是說(shuō)第二個(gè)匹配實(shí)驗(yàn)是非貪婪模式,僅僅因?yàn)榧恿恕埃俊?,繼續(xù)實(shí)驗(yà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.b
此次匹配結(jié)果,顯然是貪婪模式。奇怪了,也就是“?”的特殊組合才是非貪婪模式。
網(wǎng)上搜索得如下說(shuō)明:
標(biāo)準(zhǔn)量詞修飾的子表達(dá)式,在可匹配可不匹配的情況下,總會(huì)先嘗試進(jìn)行匹配,稱這種方式為匹配優(yōu)先,或者貪婪模式。此前介紹的一些量詞,“{m}”、“{m,n}”、“{m,}”、“?”、“*”和“+”都是匹配優(yōu)先的。
一些NFA正則引擎支持忽略優(yōu)先量詞,也就是在標(biāo)準(zhǔn)量詞后加一個(gè)“?”,此時(shí),在可匹配可不匹配的情況下,總會(huì)先忽略匹配,只有在由忽略優(yōu)先量詞修飾的子表達(dá)式,必須進(jìn)行匹配才能使整個(gè)表達(dá)式匹配成功時(shí),才會(huì)進(jìn)行匹配,稱這種方式為忽略優(yōu)先,或者非貪婪模式。忽略優(yōu)先量詞包括“{m}?”、“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。
顯然“*?”的組合是非貪婪模式,猜想正確,原來(lái)如此啊。
PS:這里再為大家提供2款非常方便的正則表達(dá)式工具供大家參考使用:
JavaScript正則表達(dá)式在線測(cè)試工具:
http://tools.jb51.net/regex/javascript
正則表達(dá)式在線生成工具:
http://tools.jb51.net/regex/create_reg
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python正則表達(dá)式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
欄 目:正則表達(dá)式
下一篇:詳解正則表達(dá)式Matcher類中g(shù)roup方法
本文標(biāo)題:python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法實(shí)例分析
本文地址:http://mengdiqiu.com.cn/a1/zhengzebiaodashi/11130.html
您可能感興趣的文章
- 01-11正則表達(dá)式實(shí)現(xiàn)添加、刪除、替換三種功能
- 01-11python 用正則表達(dá)式篩選文本信息的實(shí)例
- 01-11正則表達(dá)式之匹配數(shù)字范圍
- 01-11python爬蟲正則表達(dá)式之處理?yè)Q行符
- 01-11正則表達(dá)式匹配路由的實(shí)現(xiàn)代碼
- 01-11正則表達(dá)式截取身份證號(hào)碼加密的方法
- 01-11js正則表達(dá)式 匹配兩個(gè)特定字符間的內(nèi)容示例
- 01-11MySQL使用正則表達(dá)式進(jìn)行查詢操作經(jīng)典實(shí)例總結(jié)
- 01-11python正則表達(dá)式之對(duì)號(hào)入座篇
- 01-11詳解正則表達(dá)式實(shí)現(xiàn)二代身份證號(hào)碼驗(yàn)證


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11正則表達(dá)式實(shí)現(xiàn)添加、刪除、替換三
- 01-11正則表達(dá)式之匹配數(shù)字范圍
- 01-11python 用正則表達(dá)式篩選文本信息的實(shí)
- 01-11正則表達(dá)式匹配路由的實(shí)現(xiàn)代碼
- 01-11python爬蟲正則表達(dá)式之處理?yè)Q行符
- 01-11js正則表達(dá)式 匹配兩個(gè)特定字符間的
- 01-11正則表達(dá)式截取身份證號(hào)碼加密的方
- 01-11python正則表達(dá)式之對(duì)號(hào)入座篇
- 01-11MySQL使用正則表達(dá)式進(jìn)行查詢操作經(jīng)典
- 01-11詳解正則表達(dá)式實(shí)現(xiàn)二代身份證號(hào)碼
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法