Python 正则标志位的作用
标志位决定匹配的语义细节:是否忽略大小写、锚点是否按行生效、点号是否匹配换行、空白是否被忽略、简写类是否退回 ASCII。它们可以作为参数传入,也可以写成模式内的内联形式;内联形式的全局标志必须出现在模式最开头,局部标志则可以写在需要生效的位置。
基本信息
| 忽略大小写 | IGNORECASE,内联写作 (?i),在 Unicode 模式下按字符的折叠规则比较 |
|---|---|
| 多行与单行 | MULTILINE 让行首行尾锚点按行生效,DOTALL 让点号也匹配换行 |
| 可读模式 | VERBOSE 忽略模式中的空白并允许注释,用来写长模式 |
| 字符类语义 | ASCII 让简写类退回 ASCII 语义,UNICODE 是字符串模式的默认值 |
| 区域设置 | LOCALE 只对字节模式有效,已属遗留选项,不建议在新代码中使用 |
典型使用场景
- 大小写不敏感校验:域名、邮箱域名部分、关键字匹配都需要忽略大小写
- 逐行处理:开启多行模式让行首与行尾锚点按行走,便于按行提取
- 跨行匹配:处理带换行的块级内容时开启点号匹配换行,或改用显式字符类
- 长模式维护:用可读模式把复杂规则分行书写并加注释,评审时一目了然
- 限定 ASCII 范围:校验只允许 ASCII 的字段时显式指定,避免非 ASCII 字符混入
标志位写法
标志位写法
import re
re.search(r'abc', s, re.I | re.M) # 组合多个标志,用按位或连接
re.search(r'(?i)abc', s) # 内联写法等价于传入 IGNORECASE
re.search(r'(?i:abc)', s) # 局部标志:只对这个分组生效,可写在任意位置
re.search(r'(?s).+', s) # 让点号匹配换行
try:
re.search(r'a(?i)b', s) # 全局内联标志不在开头会直接报错
except re.error as e:
print('模式非法', e)
re.match(r'\w', '中', re.A) # 加 ASCII 后不匹配非 ASCII 单词字符常用标志与影响
| 标志 | 作用 | 影响面 |
|---|---|---|
| IGNORECASE | 忽略大小写 | 所有字符比较 |
| MULTILINE | 锚点按行生效 | 行首与行尾锚点 |
| DOTALL | 点号匹配换行 | 点号与依赖点号的量词 |
| VERBOSE | 忽略空白并允许注释 | 整个模式书写形式 |
| ASCII | 简写类退回 ASCII | 单词与数字类简写 |
| LOCALE | 按区域设置处理字节 | 仅字节模式,遗留选项 |
全局内联标志必须写在模式最开头,写在中间会直接抛错;需要局部生效时使用带冒号的形式,把标志限定在某个分组范围内,这样既清晰也不会影响整条模式。
字符类语义标志之间相互冲突:指定 ASCII 后默认的 Unicode 语义被覆盖,与区域设置选项同时使用也会报错,显式选择一种语义即可。