re.sub()返回替换后的新字符串,re.subn()返回(新字符串,替换次数)元组;前者适用于只需结果的场景,后者适合需统计或校验替换量的情况。

Python里用正则替换文本,主要靠 re.sub() 和 re.subn() 这两个函数。它们功能相似,但返回值不同——这是最核心的区别。
re.sub:只返回替换后的新字符串
它按正则模式查找匹配项,并用指定内容替换,最终只返回处理完的字符串,不告诉你替换了几次、在哪替换了。
- 语法:
re.sub(pattern, repl, string, count=0, flags=0) -
count参数可限制最多替换几次(默认全部) - 如果没匹配到,原字符串直接返回,不做改动
例子:import retext = "价格:100元,折扣后:85元"new_text = re.sub(r"\d+元", "XX元", text)print(new_text) # 输出:价格:XX元,折扣后:XX元
re.subn:返回(新字符串,替换次数)元组
它做的是和 sub 完全一样的替换操作,但额外多返回一个整数——本次成功替换了几次。
立即学习“Python免费学习笔记(深入)”;
- 语法:
re.subn(pattern, repl, string, count=0, flags=0) - 返回格式:
(new_string, number_of_subs) - 适合需要确认替换是否发生、或统计修改量的场景
例子:result, n = re.subn(r"\d+元", "XX元", text)print(result) # 价格:XX元,折扣后:XX元print(n) # 2
什么时候该选 sub,什么时候用 subn?
- 只关心“替换完的结果”,比如清洗日志、生成新文本 → 用
sub - 需要知道“有没有改成功”或“改了几处”,比如校验配置、做替换审计、写测试断言 → 用
subn - 想省一行代码解包?
sub更简洁;想避免再调一次len(re.findall(...))统计?subn更高效
小提醒:别漏掉编译模式提升性能
如果同一正则反复使用(比如在循环里替换),建议先用 re.compile() 编译,再调 sub 或 subn,速度更快、也更清晰:
pattern = re.compile(r"\b\d+\b")text = "订单号123,金额456,ID789"result, count = pattern.subn("###", text)










