捕获组与命名组
使用括号进行捕获、使用 (?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 反馈 — 无需本地设置。