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>']

 

 

posted on 2017-03-17 12:52  幸运的苹果  阅读(2135)  评论(0编辑  收藏  举报