1. 程式人生 > >python基礎:re模塊匹配時貪婪和非貪婪模式

python基礎:re模塊匹配時貪婪和非貪婪模式

audio 貪婪 數字 表達 字符串 true 數量 我們 順序

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‘
>>>

  

python基礎:re模塊匹配時貪婪和非貪婪模式