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 的基本用法。
#!/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 参数限制了替换的次数。
#!/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 可以有效地与预编译的模式一起使用。
#!/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 等标志会修改匹配行为。
#!/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 可以使用函数来动态确定替换。
#!/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 处理带有组和反向引用的复杂模式。
#!/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 等) 访问捕获的组。
带有标志的多个模式
组合多个标志以获得复杂的匹配行为。
#!/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.IGNORECASE 和 re.MULTILINE 标志。 它替换每行开头的单词,而无需考虑大小写。
最佳实践
使用 re.subn 时,请考虑以下建议
- 使用原始字符串作为模式以避免转义反斜杠
- 在执行多次替换时预编译模式
- 检查替换计数以验证操作是否成功
- 使用函数进行动态替换逻辑
- 将标志与按位 OR 运算组合以获得多种行为
性能注意事项
re.subn 具有与 re.sub 类似的性能特征。 额外的计数报告增加了可忽略的开销。
对于大型文本或复杂模式,预编译正则表达式可以显着提高性能,尤其是在循环或重复操作中。
来源
本教程介绍了 Python re.subn 函数的基本方面。 掌握此工具将增强您的文本处理能力。
作者
列出所有 Python 教程。