ZetCode

Python Match.groups() 方法

最后修改于 2025 年 4 月 20 日

Match.groups 简介

Match.groups 方法是 Python 的 re 模块的一部分。它将正则表达式匹配中所有捕获的组作为元组返回。

组是在 regex 模式中使用括号创建的。它们允许提取匹配文本的特定部分。groups 方法提供一次访问所有捕获的组的途径。

此方法在 searchmatch 等函数返回的匹配对象上调用。对于处理复杂的模式匹配至关重要。

基本语法

Match.groups 的语法很简单

match.groups(default=None)

可选的 default 参数指定对于未参与的组应返回什么。默认情况下,它为这些组返回 None

基本组示例

让我们从捕获日期字符串中的组的简单示例开始。

basic_groups.py
#!/usr/bin/python

import re

text = "Date: 2023-12-25"
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')

match = pattern.search(text)
if match:
    print("All groups:", match.groups())
    print("Year:", match.group(1))
    print("Month:", match.group(2))
    print("Day:", match.group(3))

此示例显示了如何从日期字符串中捕获年、月和日。groups 方法返回所有三个捕获的组。

pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')

该模式定义了三个用于捕获年、月和日的捕获组。 每个组捕获日期格式的特定部分。

print("All groups:", match.groups())

这将以元组形式打印所有捕获的组。 对于我们的示例文本,输出将是 ('2023', '12', '25')

包含可选部分的组

当某些组是可选的时,groups 可以很好地处理它们。

optional_groups.py
#!/usr/bin/python

import re

texts = [
    "Product: Laptop, Price: $999",
    "Product: Mouse, Price: $49, Discount: 10%",
    "Product: Keyboard"
]

pattern = re.compile(r'Product: (\w+)(?:, Price: \$(\d+))?(?:, Discount: (\d+)%)?')

for text in texts:
    match = pattern.search(text)
    if match:
        print(f"Text: '{text}'")
        print("Groups:", match.groups())

这显示了 groups 如何处理模式中的可选部分。 未匹配的组在元组中返回 None

使用默认值

我们可以为未参与的组指定默认值。

default_groups.py
#!/usr/bin/python

import re

text = "Name: John"
pattern = re.compile(r'Name: (\w+)(?:, Age: (\d+))?')

match = pattern.search(text)
if match:
    print("Groups with None:", match.groups())
    print("Groups with defaults:", match.groups('N/A'))

第二组是可选的,并且不匹配。 我们提供“N/A”作为默认值,而不是 None

命名组示例

groups 适用于编号组和命名组。

named_groups.py
#!/usr/bin/python

import re

text = "User: johndoe, ID: 12345"
pattern = re.compile(r'User: (?P<username>\w+), ID: (?P<userid>\d+)')

match = pattern.search(text)
if match:
    print("All groups:", match.groups())
    print("Username:", match.group('username'))
    print("User ID:", match.group('userid'))

命名组按照它们在模式中定义的相同顺序出现。 groups 方法在元组中返回它们。

嵌套组

对于嵌套组,groups 按顺序返回所有组。

nested_groups.py
#!/usr/bin/python

import re

text = "Coordinates: (40.7128, -74.0060)"
pattern = re.compile(r'\(((\d+\.\d+), ([-+]?\d+\.\d+))\)')

match = pattern.search(text)
if match:
    print("All groups:", match.groups())
    print("Full coordinates:", match.group(1))
    print("Latitude:", match.group(2))
    print("Longitude:", match.group(3))

此示例显示了嵌套组的工作方式。 外部组捕获完整的坐标对,而内部组捕获每个数字。

重复模式中的组

当使用重复组时,groups 仅捕获最后一个匹配项。

repeating_groups.py
#!/usr/bin/python

import re

text = "aaa bbb ccc"
pattern = re.compile(r'((\w+)\s*)+')

match = pattern.search(text)
if match:
    print("All groups:", match.groups())
    print("Full match:", match.group(0))
    print("Last word:", match.group(2))

重复组仅捕获最后一个迭代 ('ccc')。 要捕获所有匹配项,请改用 findall

非捕获组

非捕获组不会出现在 groups 结果中。

noncapturing_groups.py
#!/usr/bin/python

import re

text = "2023-12-25"
pattern = re.compile(r'(\d{4})(?:-(\d{2})(?:-(\d{2}))?)')

match = pattern.search(text)
if match:
    print("Groups:", match.groups())
    print("Year:", match.group(1))
    print("Month:", match.group(2))
    print("Day:", match.group(3))

非捕获组(使用 ?:)有助于组织模式,而无需在结果中创建额外的组。

最佳实践

使用 Match.groups 时,请考虑以下最佳实践

性能注意事项

groups 方法在 Python 中经过高度优化。 但是,对于少量组,单独访问组可能更快。

对于具有许多组的模式,请考虑是否需要一次获得所有组。 仅访问所需的组可以使代码更清晰且速度稍快。

来源

Python Match.groups() 文档

本教程介绍了 Python 的 Match.groups 方法的基本方面。 掌握组提取将使您的 regex 代码更加强大。

作者

我叫 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程