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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM