两个最常用的简写
数字类简写匹配一个数字字符,单词类简写匹配一个字母、数字或下划线。它们都属于预定义字符类,写法短,但范围由引擎的语义设置决定,而不是由写下它们的程序员决定。
范围会变
在 ASCII 语义下,数字类只认半角数字,单词类只认英文字母、半角数字与下划线;在 Unicode 语义下,两者的范围都会扩展到全角数字、其它文字系统的数字与字母。同一模式在同一个引擎里开启不同标志就可能得到不同结果。
基本信息
| 数字类 | 默认匹配半角数字,Unicode 语义下可扩展到其它数字字符 |
|---|---|
| 单词类 | 字母、数字、下划线三种集合的并集 |
| 取反写法 | 对应的大写形式表示不属于该集合的任意字符 |
| ASCII 开关 | Python 提供只认 ASCII 的标志,Java 提供 Unicode 字符类开关,方向相反,需按文档设置 |
| 等价显式写法 | 数字可用区间写出,单词字符需写成若干集合的并集 |
| 校验建议 | 严格校验字段时使用显式区间,不依赖简写类 |
典型使用场景
- 校验纯数字字段,例如编号、金额、端口号
- 提取标识符或变量名,此时下划线必须被当作合法字符
- 清洗文本中的非字母数字字符
- 区分「字母数字混排」与「含符号」的两类输入
- 判断网页标签或短链接字符集是否合法
简写类与显式写法
简写类与显式写法
import re
re.fullmatch(r'\d+', '12345') # 逐字符校验纯数字
re.fullmatch(r'[0-9]+', '12345') # 显式区间:不受 Unicode 语义影响
re.findall(r'\w+', 'user_id2') # 下划线算单词字符,会被一起取出
re.findall(r'\w+', '汉字 abc') # 文本模式下汉字也常被算作单词字符
re.findall(r'\w+', '汉字 abc', re.A) # 打开 ASCII 标志后只按半角判断
re.findall(r'\D+', 'a1b2') # 取反:非数字字符片段简写类与显式写法对照
| 简写 | ASCII 语义范围 | 常见显式替代 |
|---|---|---|
| 数字类 | 半角数字 | 区间 0 到 9 |
| 单词类 | 字母数字下划线 | 三类集合的并集 |
| 取反数字 | 非半角数字 | 除区间外的任意字符 |
| 取反单词 | 不含下划线与字母数字 | 显式排除集合 |
下划线被算作单词字符是一个高频反直觉点。做变量名或标识符提取时它符合预期,做「纯字母数字」校验时它就成了漏网之鱼,必须显式排除。
各引擎默认采用的字符语义并不统一:有的默认 Unicode 感知,有的默认 ASCII,开关名称与方向也不同。写跨语言模式时,不要凭印象判断,先在目标环境里实测一次。