Python正则替换文本案例_sub与subn区别解析【技巧】

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),第二个值是实际发生的替换次数。

  • 语法与 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 引用,两者都支持