1. 程式人生 > >Python中的貪婪和非貪婪

Python中的貪婪和非貪婪

       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'

>>>