正则表达式:边界与数量词

边界控制“从哪里开始、在哪里结束”,数量词控制“重复多少次”。把它们与字符类结合后,才能写出完整的格式规则。

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}$。

练习与自测

  1. 用 Python 对 "abc\n" 比较 re.search(r"^abc$", value) 与 re.fullmatch(r"abc", value),解释差异。
  2. 为 1~5 位 ASCII 十进制数字写模式,测试 0、001、123、123456;再决定业务是否允许前导零。
  3. 解释 ab+ 与 (?:ab)+ 的作用范围差异。
  4. 将匹配双引号内容的 ".*" 改成更具体的字符类;说明遇到转义引号时为什么应重新定义输入契约。
  5. 非贪婪数量词是否意味着不会回溯?

上一节:基础字符与字符类|下一节:分组、分支与反向引用。