### 貪婪 vs 不貪婪
當重復一個正則表達式時,如用 a\*,操作結果是盡可能多地匹配模式。當你試著匹配一對對稱的定界符,如 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>" 中的 ">",這并不是你所想要的結果。
在這種情況下,解決方案是使用不貪婪的限定符 \*?、+?、?? 或 {m,n}?,盡可能匹配小的文本。在上面的例子里, ">" 在第一個 "<" 之后被立即嘗試,當它失敗時,引擎一次增加一個字符,并在每步重試 ">"。這個處理將得到正確的結果:
```
#!python
>>> print re.match('<.*?>', s).group()
<html>
```
注意用正則表達式分析 HTML 或 XML 是痛苦的。變化混亂的模式將處理常見情況,但 HTML 和 XML 則是明顯會打破正則表達式的特殊情況;當你編寫一個正則表達式去處理所有可能的情況時,模式將變得非常復雜。象這樣的任務用 HTML 或 XML 解析器。