ZetCode

Python Match.span 方法

最后修改于 2025 年 4 月 20 日

Match.span 简介

Match.span 方法是 Python 的 re 模块的一部分。它返回一个包含匹配项起始和结束位置的元组。

此方法在正则表达式操作返回的匹配对象上可用。它提供有关文本中匹配项出现位置的精确位置信息。

理解 span 对于需要位置信息的文本处理任务至关重要,例如突出显示或提取子字符串。

基本语法

Match.span 的语法很简单

Match.span(group=0)

可选的 group 参数指定要返回位置的捕获组。默认值为 0(整个匹配项)。

基本匹配位置检索

让我们从一个在文本中查找单词位置的简单示例开始。

basic_span.py
#!/usr/bin/python

import re

text = "The quick brown fox jumps over the lazy dog"
pattern = re.compile(r'fox')

match = pattern.search(text)
if match:
    start, end = match.span()
    print(f"Found 'fox' from position {start} to {end}")
    print(f"Matched text: '{text[start:end]}'")

此示例演示如何获取匹配项的起始和结束位置。span 用于从原始文本中提取匹配的子字符串。

start, end = match.span()

span 方法返回一个包含两个整数的元组。第一个是起始索引,第二个是结束索引。

text[start:end]

使用 span 索引,我们可以对原始字符串进行切片,以精确地获取匹配的部分。这比使用 group 更有效。

带捕获组的 Span

span 方法还可以返回特定组的位置。

group_span.py
#!/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(f"Full match span: {match.span()}")
    print(f"Year span: {match.span(1)}")
    print(f"Month span: {match.span(2)}")
    print(f"Day span: {match.span(3)}")

这演示了获取不同捕获组的 span。组 0 始终是整个匹配项,而组 1+ 是捕获项。

使用 finditer 进行多次匹配

在处理多个匹配项时,span 有助于定位每个匹配项。

multi_span.py
#!/usr/bin/python

import re

text = "cat bat hat mat"
pattern = re.compile(r'[a-z]at')

for match in pattern.finditer(text):
    start, end = match.span()
    word = text[start:end]
    print(f"Found '{word}' at positions {start}-{end}")

finditer 方法返回所有出现的匹配对象。我们使用 span 来获取每个匹配项在原始文本中的位置。

带命名组的 Span

命名组使 span 位置更具可读性和可维护性。

named_span.py
#!/usr/bin/python

import re

text = "John Doe, age 30"
pattern = re.compile(r'(?P<first>\w+) (?P<last>\w+), age (?P<age>\d+)')

match = pattern.search(text)
if match:
    print(f"Name span: {match.span('first')} to {match.span('last')}")
    print(f"Age span: {match.span('age')}")

命名组允许通过有意义的名称而不是数字来访问 span。这使代码更具自文档性,并且不易出错。

Span 在替换操作中

Span 信息可以指导复杂的文本替换操作。

replace_span.py
#!/usr/bin/python

import re

text = "Error 404: Not Found; Error 500: Server Error"
pattern = re.compile(r'Error (\d{3}): ([A-Za-z ]+)')

def replace_error(match):
    code_span = match.span(1)
    desc_span = match.span(2)
    code = match.group(1)
    desc = match.group(2).lower()
    return f"Code {code} ({desc})"

result = pattern.sub(replace_error, text)
print(result)

此示例在替换函数中使用 span 信息。span 有助于理解每个匹配项的结构以进行处理。

具有重叠匹配的 Span

span 方法有助于识别重叠的匹配项。

overlap_span.py
#!/usr/bin/python

import re

text = "ababababab"
pattern = re.compile(r'(?=(abab))')

for i, match in enumerate(pattern.finditer(text), 1):
    start, end = match.span(1)
    print(f"Match {i}: '{match.group(1)}' at {start}-{end}")

这会查找文本中 'abab' 的所有重叠出现。带有 span 的前瞻模式捕获每个位置。

多行文本中的 Span

处理多行文本需要了解 span 如何计算位置。

multiline_span.py
#!/usr/bin/python

import re

text = """First line
Second line
Third line"""
pattern = re.compile(r'^(\w+)', re.MULTILINE)

for match in pattern.finditer(text):
    start, end = match.span()
    line = text[start:end]
    print(f"Found '{line}' at positions {start}-{end}")

re.MULTILINE 标志使 ^ 匹配行首。Span 位置在整个字符串中计算,包括换行符。

最佳实践

使用 Match.span 时,请遵循以下最佳实践

性能注意事项

span 方法经过高度优化,开销极小。它比单独使用 startend 更有效。

对于非常大的文本,请注意 span 位置是字节偏移量。对于 Unicode,字符计数可能与字节位置不同。

来源

Python Match.span() 文档

本教程涵盖了 Python 的 Match.span 方法的基本方面。掌握位置检索将增强您的文本处理能力。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 Python 教程