Python裏數量詞默認是貪婪的(在少數語言裏也多是默認非貪婪),老是嘗試匹配儘量多的字符;python
非貪婪則相反,老是嘗試匹配儘量少的字符。正則表達式
在"*","?","+","{m,n}"後面加上?,使貪婪變成非貪婪。3d
>>> 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以前的全部字符。code
解決方式:非貪婪操做符「?」,這個操做符能夠用在"*","+","?"的後面,要求正則匹配的越少越好。
字符串
>>> 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' >>>