0Pricing
Learn AI with Python · 课时

捕获组与命名组

使用括号进行捕获、使用 (?P ...) 创建命名组,以及学习 re.fullmatch()、前瞻和后顾

捕获组与命名组 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

为什么需要分组

分组可以让您从匹配项中分离出特定部分,从而准确提取所需内容,例如电话号码中的区号、日期中的年份或电子邮件中的用户名。

本课将介绍捕获分组、命名分组、非捕获分组和环视。

使用 ( ) 捕获分组

将模式的一部分放在圆括号中即可捕获它。完整匹配项和每个分组都可以通过匹配对象访问。

import re

m = re.search("(\d{4})-(\d{2})-(\d{2})", "Date: 2026-05-29")
print(m.group())    # "2026-05-29" (whole match)
print(m.group(1))   # "2026"
print(m.group(2))   # "05"

match.group、groups、groupdict

实用的访问器包括:

  • m.group(0) — 完整匹配项
  • m.group(n) — 第 n 个捕获内容
  • m.groups() — 包含所有捕获内容的元组
import re

m = re.search("(\d{4})-(\d{2})-(\d{2})", "2026-05-29")
print(m.groups())   # ("2026", "05", "29")
year, month, day = m.groups()

使用 (?P<name>...) 命名分组

依靠编号来标识分组很容易出错。命名分组使用 (?P<name>...),这样您就可以通过有意义的名称引用捕获内容。

import re

m = re.search("(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})", "2026-05-29")
print(m.group("year"))   # "2026"
print(m.group("month"))  # "05"

使用 groupdict 生成结构化输出

m.groupdict() 会以字典形式返回所有命名分组,非常适合将匹配到的文本转换为结构化记录。

import re

m = re.search("(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})", "2026-05-29")
print(m.groupdict())
# {"year": "2026", "month": "05", "day": "29"}

非捕获分组 (?:...)

有时您只需要使用圆括号进行分组(例如应用量词),但不希望进行捕获。这时请使用 (?:...)。

这样可以让分组编号保持整洁。

import re

# Group "ab" so + applies, but do not capture it
m = re.search("(?:ab)+(\d+)", "ababab42")
print(m.group(1))   # "42" -> group 1 is the digits, not "ab"

反向引用

反向引用 \1 会匹配某个分组之前捕获的相同文本。它适合用来查找重复的单词。

import re

# Find a word repeated twice in a row
print(re.findall("(\w+) \1", "the the cat cat sat"))
# ["the", "cat"]

前瞻断言 (?=...)

正向前瞻 (?=...)断言后面必须出现什么内容,但不会消耗该内容。被断言的文本不属于匹配结果。

这里仅当数字后面跟着 "px" 时才匹配该数字。

import re

print(re.findall("\d+(?=px)", "10px 20em 30px"))
# ["10", "30"]  -> "20" skipped (not followed by px)

负向前瞻 (?!...)

负向前瞻 (?!...)断言后面不得出现某些内容。仅当数字后面不跟着 "px" 时才匹配该数字。

import re

print(re.findall("\d+(?!px)", "10px 20em 30px"))
# matches numbers not followed directly by px

后瞻断言 (?<=...) 和 (?<!...)

后瞻断言断言匹配项的前面出现了什么内容,但不会消耗该内容:

  • (?<=...)正向——前面必须有
  • (?<!...)负向——前面不得有

这里提取前面有美元符号的金额,但不捕获该符号。

import re

print(re.findall("(?<=\$)\d+", "price $50 and 60 units"))
# ["50"]  -> only the amount after $

组合使用分组和环视断言

实际的提取器会混合使用这些工具。这个模式会提取一个命名价格,该价格前面必须有货币符号,后面必须有小数部分:

import re

text = "Total: $1299.99 paid"
m = re.search("(?<=\$)(?P<amount>\d+)\.(?P<cents>\d{2})", text)
print(m.group("amount"), m.group("cents"))   # 1299 99

快速检查:命名组

您希望使用类似 "year" 的可读名称来提取匹配项,而不是使用数字。

回顾:分组和环视断言

现在您已经可以从文本中提取精确的结构:

  • ( )捕获组,配合 m.group(n) 和 m.groups() 使用
  • (?P<name>...)命名组,配合 m.groupdict() 使用
  • (?:...)非捕获组,用于进行整洁的分组
  • 用于重复匹配的反向引用 \1
  • 前瞻断言 (?=)/(?!) 和后瞻断言 (?<=)/(?<!)

下一步:把所有内容组合起来,为 AI 清理文本。

常见问题解答

「捕获组与命名组」课时是免费的吗?

是的 — 「捕获组与命名组」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「捕获组与命名组」这节课中我会学到什么?

使用括号进行捕获、使用 (?P ...) 创建命名组,以及学习 re.fullmatch()、前瞻和后顾 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「捕获组与命名组」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn AI with Python 课中编写并运行代码吗?

能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 正则表达式模式与字符类
  2. re 模块:search、match、findall、sub
  3. 捕获组与命名组
  4. 使用正则表达式清理人工智能文本
← 返回 Learn AI with Python