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 教程。