正则表达式是一个强大的字符串处理工具,几乎所有的字符串操作都可以通过正则表达式来完成,其本质是一个特殊的字符序列,可以方便的检查一个字符串是否与我们定义的字符序列的某种模式相匹配。
正则表达式并不是 Python 所特有的,几乎所有编程语言都支持正则表达式,Python 提供了内置模块 re 和第三方模块 regex 来支持正则表达式,regex 模块提供了与 re 模块兼容的 API 接口,同时还提供了额外的功能和更全面的 Unicode 支持,本文只介绍 re 模块。
我们先来熟悉一下正则表达式的基本语法。
字符 说明 . 默认情况,匹配除了换行的任意字符;如果指定了标签 DOTALL,则匹配包括换行符的任意字符 ^ 匹配字符串的开头,在 MULTILINE 模式也匹配换行后的首个符号 $ 匹配字符串尾或者换行符的前一个字符,在 MULTILINE 模式匹配换行符的前一个字符 * 匹配前一个字符 0 到无限次 + 匹配前一个字符 1 到无限次 ? 匹配前一个字符 0 次或 1 次 {m} 匹配前一个字符 m 次 {m, n} 匹配前一个字符 m 到 n 次 *? +? ?? {m,n}? 使 *、+、?、{m,n} 变成非贪婪模式,也就是使这些匹配次数不定的表达式尽可能少的匹配 \ 转义特殊字符 [...] 用于表示一个字符集合 | 匹配 | 两边任意表达式 (...) 将括起来的表达式分组, (?aiLmsux) aiLmsux 每一个字符代表一个匹配模式,可选多个 (?:…) (...) 的不分组版本 (?P<name>…) 分组,除了原有的编号外再指定一个额外的别名 (?P=name) 引用别名为 name 的分组匹配到的字符串 (?#…) # 后面的将作为注释被忽略 (?=…) 匹配 … 的内容,但是并不消费样式的内容 (?!…) 匹配 … 不符合的情况 (?<=…) 匹配字符串的当前位置,它的前面匹配 … 的内容到当前位置 (?<!…) 匹配当前位置之前不是 ... 的样式 (?(id/name)yes-pattern|no-pattern) 如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern,no-pattern 可选,也可以被忽略 \number 匹配数字代表的组合 \A 只匹配字符串开始 \b 匹配空字符串,但只在单词开始或结尾的位置 \B 匹配空字符串,但不能在词的开头或者结尾 \d 主要匹配数字 [0-9] \D 匹配任何非十进制数字的字符 \s 匹配空白字符,主要包括:空格 \t \n \r \f \v \S 匹配任何非空白字符 \w 匹配 [a-zA-Z0-9_] \W 匹配非单词字符 \Z 只匹配字符串尾