Python中的贪婪和非贪婪

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'
 
>>>
相关文章
相关标签/搜索