當重複一個正則表達式時,如用 a*,操做結果是儘量多地匹配模式。當你試着匹配一對對稱的定界符,如 HTML 標誌中的尖括號時這個事實常常困擾你。匹配單個 HTML 標誌的模式不能正常工做,由於 .* 的本質是「貪婪」的html
#!python >>> s = '<html><head><title>Title</title>' >>> len(s) 32 >>> print re.match('<.*>', s).span() (0, 32) >>> print re.match('<.*>', s).group() <html><head><title>Title</title>
RE 匹配 在 "<html>
" 中的 "<",.* 消耗掉字符串的剩餘部分。在 RE 中保持更多的左,雖然 > 不能匹配在字符串結尾,所以正則表達式必須一個字符一個字符地回溯,直到它找到 > 的匹配。最終的匹配從 "<html" 中的 "<" 到 "</title>" 中的 ">",這並非你所想要的結果。python
在這種狀況下,解決方案是使用不貪婪的限定符 *?、+?、?? 或 {m,n}?,儘量匹配小的文本。在上面的例子裏, ">" 在第一個 "<" 以後被當即嘗試,當它失敗時,引擎一次增長一個字符,並在每步重試 ">"。這個處理將獲得正確的結果:正則表達式
#!python >>> print re.match('<.*?>', s).group() <html>
注意用正則表達式分析 HTML 或 XML 是痛苦的。變化混亂的模式將處理常見狀況,但 HTML 和 XML 則是明顯會打破正則表達式的特殊狀況;當你編寫一個正則表達式去處理全部可能的狀況時,模式將變得很是複雜。象這樣的任務用 HTML 或 XML 解析器。spa