Python Match.groups() 方法
最后修改于 2025 年 4 月 20 日
Match.groups 简介
Match.groups 方法是 Python 的 re 模块的一部分。它将正则表达式匹配中所有捕获的组作为元组返回。
组是在 regex 模式中使用括号创建的。它们允许提取匹配文本的特定部分。groups 方法提供一次访问所有捕获的组的途径。
此方法在 search 或 match 等函数返回的匹配对象上调用。对于处理复杂的模式匹配至关重要。
基本语法
Match.groups 的语法很简单
match.groups(default=None)
可选的 default 参数指定对于未参与的组应返回什么。默认情况下,它为这些组返回 None。
基本组示例
让我们从捕获日期字符串中的组的简单示例开始。
#!/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 可以很好地处理它们。
#!/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。
使用默认值
我们可以为未参与的组指定默认值。
#!/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 适用于编号组和命名组。
#!/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 按顺序返回所有组。
#!/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 仅捕获最后一个匹配项。
#!/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 结果中。
#!/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 时,请考虑以下最佳实践
- 使用命名组以提高复杂模式的可读性
- 当模式有很多组时,记录您的组结构
- 使用命名组时,考虑使用
groupdict - 处理代码中可选组的
None值 - 测试某些组可能不匹配的边缘情况
性能注意事项
groups 方法在 Python 中经过高度优化。 但是,对于少量组,单独访问组可能更快。
对于具有许多组的模式,请考虑是否需要一次获得所有组。 仅访问所需的组可以使代码更清晰且速度稍快。
来源
本教程介绍了 Python 的 Match.groups 方法的基本方面。 掌握组提取将使您的 regex 代码更加强大。
作者
列出所有 Python 教程。