ZetCode

Python re.subn() 函数

最后修改于 2025 年 4 月 20 日

re.subn 简介

re.subn 函数是 Python re 模块中用于模式替换的强大工具。它的工作方式类似于 re.sub,但会返回有关所做替换的额外信息。

此函数执行基于正则表达式的搜索和替换操作,同时统计执行了多少次替换。 它返回一个元组,其中包含修改后的字符串和替换计数。

当您需要知道在文本处理过程中发生了多少次替换时,re.subn 特别有用。 它与 re.sub 共享相同的参数,但提供额外的反馈。

基本语法

re.subn 的语法与 re.sub 类似

re.subn(pattern, repl, string, count=0, flags=0)

参数包括正则表达式模式、替换字符串、输入文本、可选的最大替换次数和可选的标志。 返回值是一个元组。

带计数的简单替换

此示例演示了 re.subn 的基本用法。

basic_subn.py
#!/usr/bin/python

import re

text = "The rain in Spain falls mainly in the plain"
result = re.subn(r'ain', 'ane', text)

print(f"Modified text: {result[0]}")
print(f"Substitutions made: {result[1]}")

这会将所有出现的“ain”替换为“ane”并报告计数。 结果元组包含修改后的字符串和替换次数。

result = re.subn(r'ain', 'ane', text)

该函数扫描文本以查找模式“ain”,并将每个匹配项替换为“ane”。 它同时返回新字符串和替换计数。

print(f"Substitutions made: {result[1]}")

元组的第二个元素 (result[1]) 给出了操作中执行的确切替换次数。

带计数的限制替换

count 参数限制了替换的次数。

limited_subn.py
#!/usr/bin/python

import re

text = "apple apple apple apple"
result = re.subn(r'apple', 'orange', text, count=2)

print(f"Modified text: {result[0]}")
print(f"Substitutions made: {result[1]}")

此示例仅替换前两个出现的“apple”,尽管存在四个。 count 参数控制最大替换次数。

使用已编译的模式

re.subn 可以有效地与预编译的模式一起使用。

compiled_subn.py
#!/usr/bin/python

import re

text = "User1: 100, User2: 200, User3: 300"
pattern = re.compile(r'\d+')
result = pattern.subn('XXX', text)

print(f"Modified text: {result[0]}")
print(f"Numbers replaced: {result[1]}")

在这里,我们编译一个匹配数字的模式,然后将其与 subn 一起使用。 在执行多次替换时,这种方法很有效。

不区分大小写的替换

re.IGNORECASE 等标志会修改匹配行为。

case_insensitive.py
#!/usr/bin/python

import re

text = "Python is FUN, fun, FUN!"
result = re.subn(r'fun', 'great', text, flags=re.IGNORECASE)

print(f"Modified text: {result[0]}")
print(f"Replacements: {result[1]}")

re.IGNORECASE 标志使替换不区分大小写。 “fun”的所有变体都会被替换,而无需考虑大小写。

使用替换函数

re.subn 可以使用函数来动态确定替换。

function_replacement.py
#!/usr/bin/python

import re

def double_match(match):
    return str(int(match.group()) * 2)

text = "Scores: 10, 20, 30"
result = re.subn(r'\d+', double_match, text)

print(f"Modified text: {result[0]}")
print(f"Numbers doubled: {result[1]}")

此示例将文本中的所有数值翻倍。 替换函数接收匹配对象并返回替换字符串。

复杂模式替换

re.subn 处理带有组和反向引用的复杂模式。

complex_pattern.py
#!/usr/bin/python

import re

text = "2023-04-20, 2024-05-21, 2025-06-22"
result = re.subn(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text)

print(f"Modified dates: {result[0]}")
print(f"Dates reformatted: {result[1]}")

这会将日期从 YYYY-MM-DD 重新格式化为 MM/DD/YYYY 格式。 反向引用 (\1, \2 等) 访问捕获的组。

带有标志的多个模式

组合多个标志以获得复杂的匹配行为。

multi_flag.py
#!/usr/bin/python

import re

text = "Start\nmiddle\nEnd"
result = re.subn(r'^[a-z]+', 'WORD', text, flags=re.IGNORECASE|re.MULTILINE)

print(f"Modified text: {result[0]}")
print(f"Words replaced: {result[1]}")

这同时使用 re.IGNORECASEre.MULTILINE 标志。 它替换每行开头的单词,而无需考虑大小写。

最佳实践

使用 re.subn 时,请考虑以下建议

性能注意事项

re.subn 具有与 re.sub 类似的性能特征。 额外的计数报告增加了可忽略的开销。

对于大型文本或复杂模式,预编译正则表达式可以显着提高性能,尤其是在循环或重复操作中。

来源

Python re.subn() 文档

本教程介绍了 Python re.subn 函数的基本方面。 掌握此工具将增强您的文本处理能力。

作者

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

列出所有 Python 教程