ZetCode

Python Match.group() 方法

最后修改于 2025 年 4 月 20 日

Match.group 介绍

Match.group 方法是 Python 的 re 模块的一个基本组成部分。它从正则表达式模式中返回匹配的一个或多个子组。

当在正则表达式模式中使用捕获组时,Match.group 允许您访问每个组的匹配文本。组是通过模式中的括号创建的。

该方法可以通过数字返回单个组,可以作为元组返回多个组,或者在不带参数调用时返回所有组。这对于从文本中提取结构化数据至关重要。

基本语法

Match.group 的语法很灵活

group([group1, ...])

不带参数调用时,它返回整个匹配项。带一个参数时,返回该组的匹配项。多个参数返回匹配项的元组。

基本组提取

让我们从一个提取单个组的简单示例开始。

basic_group.py
#!/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 包含日期。

命名组

命名组使模式更具可读性和可维护性。

named_groups.py
#!/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 将所有命名组作为字典返回。

多个组

您可以通过传递多个参数一次检索多个组。

multiple_groups.py
#!/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}")

这在一个调用中提取纬度和经度分量。该方法返回指定顺序的匹配元组。

可选组

处理某些组可能不匹配的模式需要小心。

optional_groups.py
#!/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(?:...) 创建一个非捕获组。

嵌套组

组可以嵌套,编号遵循它们的开括号。

nested_groups.py
#!/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)}")

外部组捕获完整的版本字符串,而内部组捕获单个组件。组编号遵循开括号。

替换中的反向引用

组使用反向引用实现强大的文本转换。

backreferences.py
#!/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 时,请遵循以下最佳实践

性能注意事项

按索引访问组比按名称访问略快。 但是,在大多数情况下,这种差异可以忽略不计。

具有许多组的复杂模式可能会影响性能。 根据您的用例,在可读性和效率之间取得平衡。

来源

Python Match.group() 文档

本教程涵盖了 Python 的 Match.group 方法的基本方面。 掌握组提取将使您的正则表达式代码更加强大且易于维护。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程