![](https://csdnimg.cn/release/download_crawler_static/9449254/bg4.jpg)
在假如它要匹配字符串‘abcbd’:
引擎尽可能远地匹配[bcd]*,直到该字符串的结尾
引擎尝试去匹配 b,但当前位置已经是字符串的末尾了,所
以失败
引擎再次尝试匹配 b,但是当前位置最后一个字符是 d,所以
失败
再次匹配 b,这一次当前位置的字符正好是 b,所以匹配成功
RE 匹配完成,所以最终,RE 匹配的结果是 abcb。这个例子证明了上述的讨论,正则表
达式引擎总是先尽可能远的匹配重复的字符,如果不匹配,他将逐步回退,然后再次尝试去
匹配 RE 剩余的部分,直到重复字符的个数为 0,如果这时仍然匹配失败,引擎就会得出结
论:这个字符串不匹配这个 RE。
另一个表示重复的元字符是加号 + ,它指定匹配它前面的字符 1 次或者多次。这里要
注意星号 * 和加号 + 的区别,星号 * 匹配 0 次或者多次,所以被匹配的内容可能压根儿
就不出现,但是加号 + 要求重复的字符至少出现 1 次。举一个简单的例子,ca+t 可以匹配
cat(1 个 a 字符)、caaat(3 个 a 字符),但是它不匹配 ct。
还有两个表示重复的元字符,其中一个就是问号 ? ,它用于指定匹配它前面的字符 0
次或者 1 次,你可以认为它用于标志一个可选的字符。比如,home-?brew 可以匹配 homebrew
或者 home-brew。
最灵活的表示重复的限定符应该是{m,n},这里的 m 和 n 都是十进制数字。这表示它前
面的字符至少重复 m 次,最多重复 n 次。比如,a/{1,3}b 可以匹配 a/b,a//b 和 a///b。但是
它不匹配 ab,因为 ab 没有斜杠,也不匹配 a////b,因为它有 4 个斜杠超过了 3 个。
你也可以省略 m 或者 n,在这种情况下,引擎会假定一个合理的替代值。省略 m 将默
认下限为 0,省略 n 将默认无上限,即上限无穷大——当然,根据上文提到的,它不能超过
2 亿。(译者注:还有一种使用方式,{n}指定它前面的字符重复 n 次)
聪明的读者可能已经发现了,上文提到的星号 *、加号 + 和问号 ? 都可以用这个限定
符表示。{0,}与星号 * 作用一样,{1,}与加号 + 作用一样,{0,1}与问号 ? 作用一样。然而,
在实际应用中,首选星号 * 、加号 + 和问号 ? ,因为它们更短,效率更高。
3.使用正则表达式
现在,我们已经学习了一些简单的正则表达式,但我们应该怎么在 Python 中使用它们
呢?re 模块提供了一个连接正则表达式引擎的接口,允许你将 RE 编译成对象并利用它们进
行匹配。
3.1.编译正则表达式
正则表达式被编译成模式对象,该对象拥有很多方法来进行各种各样的操作,比如按照