精确控制次数
花括号把重复次数写成明确的区间:写一个数字表示必须正好重复那么多次,写「下界逗号上界」表示允许的取值范围,只写「下界逗号」表示不少于下界。它把「大概多少次」变成可校验的约束,是写严格模式时最该优先使用的量词。
区间与贪婪
花括号量词默认同样是贪婪的,会优先尝试上界,匹配失败再往下退。加问号可改成非贪婪,优先试下界。上下界相等时不存在选择余地,行为最确定,也最容易读懂。
基本信息
| 固定次数 | 花括号内写单个数字,表示恰好重复该次数 |
|---|---|
| 区间次数 | 下界逗号上界,两端都包含 |
| 无上界 | 下界后直接跟右花括号,表示至少有下界那么多次 |
| 默认风格 | 贪婪,先行尝试较大次数 |
| 边界限制 | 各引擎对上界有不同上限,写极值时以目标引擎文档为准 |
| 转义差异 | POSIX 基本正则里花括号需要转义才当量词用 |
典型使用场景
- 校验证件号、订单号这类长度固定的字段,比反复堆叠字符更清楚
- 匹配手机号、区号等长度区间的数字串
- 校验密码长度范围,规则直接写在模式里,便于评审
- 匹配固定宽度的日志字段或定长编码
- 限制重复段落数量,避免无限重复造成的性能问题
次数约束的写法
次数约束的写法
import re
re.fullmatch(r'\d{6}', '123456') # 恰好六位数字
re.fullmatch(r'\w{6,12}', 'abc12345') # 长度在六到十二位之间
re.findall(r'\d{2,}', '1 22 333') # 至少两位的数字串
re.fullmatch(r'[A-F0-9]{8}-[A-F0-9]{4}', 'A1B2C3D4-0000') # 定长段拼接
re.fullmatch(r'a{2,5}?', 'aaaaa') # 非贪婪版本,尽量取下限
re.search(r'(ab){2}', 'abab') # 分组重复:整组重复两次花括号写法对照
| 写法 | 含义 | 常见用途 |
|---|---|---|
| 单数字 | 恰好重复该次数 | 定长编号、定长字段 |
| 下界逗号上界 | 次数在闭区间内 | 长度范围校验 |
| 下界逗号 | 至少重复下界次 | 至少若干位的数字 |
| 加问号 | 非贪婪,优先取下界 | 配合后续约束做最短匹配 |
写长度校验时优先用带锚点的全串匹配,而不是把花括号量词塞在任意位置。没有锚点时,模式只要求「存在一段满足长度约束的子串」,与「整个字段长度合规」是两回事。
花括号量词作用于紧邻其前的单个元素。想限制整组重复次数必须加圆括号,否则实际限制的是最后一个字符的重复次数,这是最常见的语义偏差来源。