正則表達式中用於表示匹配數量的元字符如下:
? 重復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>']