Python Match.group() 方法
最后修改于 2025 年 4 月 20 日
Match.group 介绍
Match.group
方法是 Python 的 re
模块的一个基本组成部分。它从正则表达式模式中返回匹配的一个或多个子组。
当在正则表达式模式中使用捕获组时,Match.group
允许您访问每个组的匹配文本。组是通过模式中的括号创建的。
该方法可以通过数字返回单个组,可以作为元组返回多个组,或者在不带参数调用时返回所有组。这对于从文本中提取结构化数据至关重要。
基本语法
Match.group
的语法很灵活
group([group1, ...])
不带参数调用时,它返回整个匹配项。带一个参数时,返回该组的匹配项。多个参数返回匹配项的元组。
基本组提取
让我们从一个提取单个组的简单示例开始。
#!/usr/bin/python import re text = "Date: 2023-12-25" pattern = re.compile(r'Date: (\d{4})-(\d{2})-(\d{2})') match = pattern.search(text) if match: print(f"Full match: {match.group(0)}") print(f"Year: {match.group(1)}") print(f"Month: {match.group(2)}") print(f"Day: {match.group(3)}")
此示例显示了如何使用编号组提取日期组件。组 0 始终包含整个匹配的文本。
pattern = re.compile(r'Date: (\d{4})-(\d{2})-(\d{2})')
该模式定义了三个用于年、月和日的捕获组。每个组匹配特定数量的数字。
print(f"Year: {match.group(1)}")
我们通过其位置访问每个组。组 1 包含年份,组 2 包含月份,组 3 包含日期。
命名组
命名组使模式更具可读性和可维护性。
#!/usr/bin/python import re text = "Temperature: 23.5°C" pattern = re.compile(r'Temperature: (?P<value>\d+\.\d+)°(?P<unit>[CF])') match = pattern.search(text) if match: print(f"Value: {match.group('value')}") print(f"Unit: {match.group('unit')}") print(f"All groups: {match.groupdict()}")
命名组使用 (?P<name>...)
语法。可以通过名称或位置访问它们,并且 groupdict
将所有命名组作为字典返回。
多个组
您可以通过传递多个参数一次检索多个组。
#!/usr/bin/python import re text = "Coordinates: 40.7128° N, 74.0060° W" pattern = re.compile(r'(\d+\.\d+)° ([NS]), (\d+\.\d+)° ([EW])') match = pattern.search(text) if match: lat, ns, lon, ew = match.group(1, 2, 3, 4) print(f"Latitude: {lat}° {ns}") print(f"Longitude: {lon}° {ew}")
这在一个调用中提取纬度和经度分量。该方法返回指定顺序的匹配元组。
可选组
处理某些组可能不匹配的模式需要小心。
#!/usr/bin/python import re texts = ["Phone: 123-4567", "Phone: 123-4567 ext. 890"] pattern = re.compile(r'(\d{3})-(\d{4})(?: ext\. (\d{3}))?') for text in texts: match = pattern.search(text) if match: print(f"Main number: {match.group(1)}-{match.group(2)}") print(f"Extension: {match.group(3) or 'None'}")
扩展组是可选的。当未匹配时,group(3)
返回 None
。(?:...)
创建一个非捕获组。
嵌套组
组可以嵌套,编号遵循它们的开括号。
#!/usr/bin/python import re text = "Version: 2.1.4 (build 3256)" pattern = re.compile(r'Version: ((\d+)\.(\d+)\.(\d+)) \(build (\d+)\)') match = pattern.search(text) if match: print(f"Full version: {match.group(1)}") print(f"Major: {match.group(2)}, Minor: {match.group(3)}") print(f"Patch: {match.group(4)}, Build: {match.group(5)}")
外部组捕获完整的版本字符串,而内部组捕获单个组件。组编号遵循开括号。
替换中的反向引用
组使用反向引用实现强大的文本转换。
#!/usr/bin/python import re text = "Smith, John; Doe, Jane" pattern = re.compile(r'(\w+), (\w+)') # Swap last and first names result = pattern.sub(r'\2 \1', text) print("Reversed names:", result)
这使用替换中的反向引用交换姓氏和名字。 \1
指的是第一组,\2
指的是第二组。
最佳实践
使用 Match.group
时,请遵循以下最佳实践
- 使用命名组以获得更好的可读性和可维护性
- 在访问组之前检查它是否已匹配(可能为 None)
- 在复杂模式中记录您的组编号方案
- 考虑对命名组使用
groupdict
- 当您不需要匹配时,请使用非捕获组
(?:...)
性能注意事项
按索引访问组比按名称访问略快。 但是,在大多数情况下,这种差异可以忽略不计。
具有许多组的复杂模式可能会影响性能。 根据您的用例,在可读性和效率之间取得平衡。
来源
本教程涵盖了 Python 的 Match.group
方法的基本方面。 掌握组提取将使您的正则表达式代码更加强大且易于维护。
作者
列出所有 Python 教程。