python 的正则表达式 贪婪模式与懒惰模式
正则表达式中用于表示匹配数量的元字符如下:
? 重复0次或1次,等同于{0,1}
* 重复0次或更多次,等同于{0,}
+ 重复1次或更多次,等同于{1,}
{n,} 重复n次及以上
上面的表示匹配次数的元字符分为贪婪型和懒惰型2种类型。其表达式分别如下。
贪婪型 懒惰型
* *?
+ +?
{n,} {n,}?
贪婪型的匹配会去抓取满足匹配的最长的字符串,这个也是正则表达式的默认的模式。当我们不需要最长的匹配的时候就需要使用懒惰模式。
关于贪婪型和懒惰型的举例如下:
元字符'*'的贪婪模式 '*?'
1 >>> s="abcbd" 2 >>> patt=r'a.*b' #*的贪婪类型 3 >>> re.search(patt,s).group() 4 'abcb' 5 6 >>> patt=r'a.*?b' #*的懒惰类型 7 >>> re.search(patt,s).group() 8 'ab'
1 >>> s='caaaaab' 2 >>> patt=r'a.+b' #+的贪婪类型 3 >>> s='caaaaabcccb' 4 >>> re.search(patt,s).group() 5 6 >>> patt=r'a.+?b' #+的懒惰类型 7 >>> re.search(patt,s).group() 8 'aaaaab'
下面举例匹配html的例子,假如要匹配标签<li >和</li>之间的内容:
1 >>> s=r'my string is:<li>QQemail</li><li>Not read email</a></li>' 2 3 >>> patt=r'<li>.*</li>' 4 >>> print re.search(patt,s).group() 5 <li>QQemail</li><li>Not read email</a></li> #贪婪类型,匹配多了 6 7 >>> patt=r'<li>.*?</li>' 8 >>> print re.search(patt,s).group() 9 <li>QQemail</li> #懒惰类型,匹配刚好
1 >>> print re.findall(patt,s) 2 ['<li>QQemail</li>', '<li>Not read email</a></li>']