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

Python正则替换中,re.sub() 和 re.subn() 都用于替换匹配内容,但返回结果不同:前者只返回替换后的字符串,后者额外返回替换次数。
re.sub():专注结果,简洁直接
它执行替换后,只返回处理完成的字符串,适合你只关心“最终文本长什么样”的场景。
- 语法:
re.sub(pattern, repl, string, count=0, flags=0) -
count参数可限制最多替换几次(默认全部) - 若没匹配,原字符串直接返回,不报错
例如:
import re
text = "价格:100元,折扣价:85元"
result = re.sub(r"\d+元", "XX元", text)
print(result) # 输出:价格:XX元,折扣价:XX元
re.subn():带计数的替换,适合调试或统计
它返回一个二元组 (new_string, number_of_subs),第二个值是实际发生的替换次数。
立即学习“Python免费学习笔记(深入)”;
- 语法与
sub完全一致,只是返回值多一个数字 - 当你需要确认是否真的替换了、替换了几次,或者做条件判断时很实用
- 比如日志清洗中,想跳过“未改动”的行,就可以用这个计数过滤
例如:
import re
text = "abc123def456ghi"
new_text, n = re.subn(r"\d+", "[NUM]", text)
print(new_text) # abc[NUM]def[NUM]ghi
print(n) # 2
什么时候该选哪个?
看你的后续动作:
- 只要新文本 → 用
sub,代码更干净 - 要检查替换是否发生、或需记录/校验替换数量 → 用
subn - 批量处理大量文本且需监控替换率(如 95% 的地址都成功标准化)→
subn更易汇总统计
小提醒:别忽略 count 和 flags
两个函数都支持 count(限制替换次数)和 flags(如 re.I 忽略大小写),这些参数对二者完全通用。
-
count=1可实现“只换第一个”,避免误改 -
flags=re.IGNORECASE在替换关键词时不区分大小写 - 如果正则含捕获组,
repl中可用\1、\2引用,两者都支持










