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