1. 简介
正则表达式是一个强大的字符串处理工具,几乎所有的字符串操作都可以通过正则表达式来完成,其本质是一个特殊的字符序列,可以方便的检查一个字符串是否与我们定义的字符序列的某种模式相匹配。
正则表达式并不是 Python 所特有的,几乎所有编程语言都支持正则表达式,Python 提供了内置模块 re
和第三方模块 regex
来支持正则表达式,regex
模块提供了与 re
模块兼容的 API 接口,同时还提供了额外的功能和更全面的 Unicode 支持,本文只介绍 re
模块。
2. 使用
2.1 语法
我们先来熟悉一下正则表达式的基本语法。
字符 | 说明 |
---|---|
. |
默认情况,匹配除了换行的任意字符;如果指定了标签 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 |
只匹配字符串尾 |
2.2 re 模块
2.2.1 模块内容
re 模块几乎包含了正则表达式的所有功能,我们先来看一下该模块的主要方法。
re.compile(pattern, flags=0)
用于编译正则表达式,生成一个正则表达式(Pattern)对象,供 match() 和 search() 这两个函数使用。参数说明如下:
- pattern : 一个字符串形式的正则表达式
- flags : 匹配模式,包括如下:
参数 | 说明 |
---|---|
re.A |
让 \w, \W, \b, \B, \d, \D, \s, \S 只匹配 ASCII |
re.I |
忽略大小写 |
re.M |
多行模式 |
re.L |
由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配 |
re.S |
. 匹配包括换行符在内的任意字符 |
re.U |
在 Python3 中是冗余的,因为 Python3 中字符串已经默认为 Unicode |
re.X |
忽略空格和 # 后面的注释 |
看一下示例:
import re
re.compile(r'abc', re.I)
re.search(pattern, string, flags=0)
扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象;如果没有匹配,就返回一个 None。参数说明如下:
- pattern:匹配的正则表达式
- string:要匹配的字符串
- flags:匹配模式
看一下示例:
import re
print(re