![](https://csdnimg.cn/release/download_crawler_static/37646740/bg4.jpg)
表达式不是 Python 语言的核心部分,也没有为它创建特定的语法。 (应用程
序根本就不需要 REs,因此没必要包含它们去使语言说明变得臃肿不堪。 )而
re 模块则只是以一个 C 扩展模块的形式来被 Python 包含,就象 socket 或
zlib 模块一样。
将 REs 作为字符串以保证 Python 语言的简洁,但这样带来的一个麻烦就是象
下节标题所讲的。
[编辑 ] 反斜杠的麻烦
在早期规定中,正则表达式用反斜杠字符 ("\") 来表示特殊格式或允许使用特
殊字符而不调用它的特殊用法。这就与 Python 在字符串中的那些起相同作用
的相同字符产生了冲突。
让我们举例说明,你想写一个 RE 以匹配字符串 "\section" ,可能是在一个
LATEX 文件查找。为了要在程序代码中判断,首先要写出想要匹配的字符串。
接下来你需要在所有反斜杠和元字符前加反斜杠来取消其特殊意义。
字符 阶段
\section 要匹配的字符串
\\section 为 re.compile 取消反斜杠的特殊意义
"\\\\section" 为字符串取消反斜杠
简单地说,为了匹配一个反斜杠,不得不在 RE 字符串中写 '\\\\' ,因为正则
表达式中必须是 "\\" ,而每个反斜杠按 Python 字符串字母表示的常规必须表
示成 "\\" 。在 REs 中反斜杠的这个重复特性会导致大量重复的反斜杠,而且
所生成的字符串也很难懂。
解决的办法就是为正则表达式使用 Python 的 raw 字符串表示;在字符串前加
个 "r" 反斜杠就不会被任何特殊方式处理,所以 r"\n" 就是包含 "\" 和 "n"
的两个字符,而 "\n" 则是一个字符,表示一个换行。正则表达式通常在
Python 代码中都是用这种 raw 字符串表示。
常规字符串 Raw 字符串
"ab*" r"ab*"
"\\\\section" r"\\section"
"\\w+\\s+\\1" r"\w+\s+\1"
执行匹配
一旦你有了已经编译了的正则表达式的对象,你要用它做什么呢?
`RegexObject` 实例有一些方法和属性。这里只显示了最重要的几个,如果要
看完整的列表请查阅 Python Library Reference
方法 /属性 作用
match() 决定 RE 是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个 RE 匹配的位置
findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回
finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回
如果没有匹配到的话, match() 和 search() 将返回 None。如果成功的话,就
会返回一个 `MatchObject` 实例,其中有这次匹配的信息:它是从哪里开始和