1. 程式人生 > 程式設計 >python re模組匹配貪婪和非貪婪模式詳解

python re模組匹配貪婪和非貪婪模式詳解

這篇文章主要介紹了python re模組匹配貪婪和非貪婪模式詳解,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

python貪婪和非貪婪

正則表示式通常用於在文字中查詢匹配的字串。Python裡數量詞預設是貪婪的(在少數語言裡也可能是預設非貪婪),總是嘗試匹配儘可能多的字元;非貪婪則相反,總是嘗試匹配儘可能少的字元。在"*","?","+","{m,n}"後面加上?,使貪婪變成非貪婪。

>>> s="This is a number 234-235-22-423"
>>> r=re.match(".+(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'4-235-22-423'
>>> r=re.match(".+?(\d+-\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22-423'
>>>

正則表示式模式中使用到通配字,那它在從左到右的順序求值時,會盡量“抓取”滿足匹配最長字串,在我們上面的例子裡面,“.+”會從字元 串的啟始處抓取滿足模式的最長字元,其中包括我們想得到的第一個整型欄位的中的大部分,“\d+”只需一位字元就可以匹配,所以它匹配了數字“4”,而“.+”則匹配了從字串起始到這個第一位數字4之前的所有字元。

解決方式:非貪婪操作符“?”,這個操作符可以用在"*","?"的後面,要求正則匹配的越少越好。

下面這個例子仔細體會下

>>> re.match(r"aa(\d+)","aa2343ddd").group(1)
'2343'
>>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
'2'
>>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1) 
'2343'
>>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
'2343'
>>>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。