正则表达式:边界与数量词
边界控制“从哪里开始、在哪里结束”,数量词控制“重复多少次”。把它们与字符类结合后,才能写出完整的格式规则。
1. 开始和结束边界:^ 与 $
功能说明
^ 匹配输入或行的开始位置,$ 匹配输入或行的结束位置;它们匹配的是位置,不会消耗字符。开启多行模式后,二者还可约束每一行。需要注意:Python 中 $ 也能匹配输入末尾换行之前的位置,其他引擎也有各自的绝对结尾语法。验证一个 Python 字段时优先调用 fullmatch,不要仅凭 ^...$ 猜测完整性。
语法格式
^模式$简单示例
^[0-9]{4}-[0-9]{2}-[0-9]{2}$测试文本:2026-07-12、日期:2026-07-12、2026-07-12 已确认
匹配结果说明
只有 2026-07-12 符合示例形状;前后出现普通额外文本的两项不匹配。实际 Python 校验应使用 re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}", value),避免末尾换行等锚点细节。该规则仍不证明日期真实存在。
2. 单词边界:\b 与 \B
功能说明
\b 匹配单词字符与非单词字符之间的位置,或字符串边界处的位置;\B 匹配不满足单词边界的位置。它们不匹配实际字符。由于“单词字符”依赖 \w 的定义,处理中文和其他 Unicode 文本时要额外验证。
语法格式
\b单词\b
\B片段\B简单示例
\bcat\b测试文本:cat catalog copycat cat-1
匹配结果说明
结果是第一个 cat 和 cat-1 中的 cat。catalog 与 copycat 中的 cat 都紧邻其他单词字符,因此不构成两侧单词边界,不匹配。
3. 数量词:*、+、?、{n}、{n,}、{n,m}
功能说明
数量词作用于其前一个可重复元素(普通字符、字符类或分组),用于限制重复次数。* 是零次或多次,+ 是一次或多次,? 是零次或一次,{n} 是恰好 n 次,{n,} 是至少 n 次,{n,m} 是 n 到 m 次。断言能否被量化及其语义并不跨引擎通用,本课程不把它当作可移植写法。
语法格式
元素* 0 次或多次
元素+ 1 次或多次
元素? 0 次或 1 次
元素{n} 恰好 n 次
元素{n,} 至少 n 次
元素{n,m} n 到 m 次简单示例
colou?r
\d{4}
[A-Za-z]{3,8}测试文本:color colour 2026 a abcd abcdefghi
匹配结果说明
colou?r 匹配 color 与 colour,因为 u 可有可无。\d{4} 匹配 2026。[A-Za-z]{3,8} 会匹配长度在 3 到 8 之间的字母片段;对 abcdefghi,搜索式匹配可能只返回前 8 个字符,若要拒绝整个超长输入,应结合 ^ 与 $。
4. 贪婪匹配与非贪婪匹配
功能说明
默认数量词是贪婪的:在能让整体表达式成功的前提下,它会尽量多地吞入字符。给数量词加 ? 后缀可变为非贪婪(懒惰)匹配:它会先尝试最少字符,再按需扩张。非贪婪不等于“绝不回溯”,仍可能回溯以让整体匹配成功。
语法格式
贪婪:.* .+ \d{2,}
非贪婪:.*? .+? \d{2,}?简单示例
".+"
".+?"测试文本:"first" and "second"
匹配结果说明
贪婪模式 ".+" 会从第一个双引号一直匹配到最后一个双引号,结果为整个 "first" and "second"。非贪婪模式 ".+?" 在全局查找时会得到两个结果:"first" 和 "second"。若内容可含转义引号或跨行文本,还需增加更具体的规则与标志。
5. 数量词作用范围
功能说明
数量词只作用于紧邻它的前一个原子。要让数量词作用于多个字符,必须先用分组把这段模式变为一个整体;这是初学者常见的误解来源。
语法格式
ab+ # 只重复 b
(ab)+ # 重复整个 ab简单示例
(ha){2,3}测试文本:ha haha hahaha hahahaha
匹配结果说明
模式会匹配 haha 和 hahaha。在搜索式匹配中,hahahaha 的前六个字符也可能被匹配为 hahaha;若目标是验证整个字符串,应使用 ^(ha){2,3}$。
练习与自测
- 用 Python 对
"abc\n"比较re.search(r"^abc$", value)与re.fullmatch(r"abc", value),解释差异。 - 为 1~5 位 ASCII 十进制数字写模式,测试
0、001、123、123456;再决定业务是否允许前导零。 - 解释
ab+与(?:ab)+的作用范围差异。 - 将匹配双引号内容的
".*"改成更具体的字符类;说明遇到转义引号时为什么应重新定义输入契约。 - 非贪婪数量词是否意味着不会回溯?
上一节:基础字符与字符类|下一节:分组、分支与反向引用。