首页/开发/正则与编码速查/Python 正则替换与回调函数

Python 正则替换与回调函数

Python 的替换接口用模板字符串或回调函数决定替换内容:模板支持序号与命名组引用,回调接收匹配对象并返回字符串,适合条件判断场景。subn 与 sub 的区别在于是否返回替换次数,模板一律建议使用原始字符串以免转义混淆。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌‌‌​​‌​‌‌‌​‌​​​‌‌​‌​​​​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​‌​‌‌​​​‌​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

Python 正则替换与回调

替换接口把匹配到的内容换成新文本:替换内容既可以是带组引用的模板字符串,也可以是一个函数,由函数按每次匹配的结果自行决定替换成什么。模板字符串适合格式统一的改写,函数适合需要条件判断、查表或调用其他逻辑的场景,例如把匹配到的编码翻译成名称。

基本信息

接口签名sub 参数依次为模式、替换内容、待处理字符串、替换次数、标志位
返回差异sub 返回改写后的字符串,subn 额外返回替换发生的次数
替换模板可以引用组,序号引用与命名引用都支持,还能引用整段匹配
回调形式替换内容传函数时,函数接收一个匹配对象,返回值作为替换内容

典型使用场景

  • 格式归一:把日期或电话号码的分隔符统一替换成一种写法
  • 脱敏处理:按模式把敏感片段替换为掩码,日志与导出文件都要经过这一步
  • 模板渲染:把占位符替换成实际取值,占位符名称与数据键保持一致
  • 条件改写:命中不同分支时替换成不同内容,用回调函数集中处理判断
  • 限制替换范围:只替换前若干处,保留其余内容不动

模板与回调写法

模板与回调写法
import re
re.sub(r'\d+', '#', 'a1b22')              # 全部替换:'a#b#'
re.sub(r'\d+', '#', 'a1b22', count=1)     # 只替换第一处:'a#b22'
re.subn(r'\d+', '#', 'a1b22')             # ('a#b#',2):额外拿到次数
re.sub(r'(\w+)@(\w+)', r'\2@\1', 'a@b')  # 交换两部分,模板建议用原始字符串
re.sub(r'(?P<k>\w+)=(?P<v>\w+)', r'\g<k>: \g<v>', 'a=1')  # 命名引用
def mask(m):
    return m.group(0)[:2] + '**'           # 回调返回字符串作为替换内容
re.sub(r'\d{6,}', mask, text)              # 需要条件判断时改用回调

替换内容的形式

形式写法要点适用场合
固定文本直接给字符串统一替换为同一内容
序号引用模板里写反斜杠加序号按位置重组片段
命名引用模板里写组名形式模式较长时可读性更好
整段引用模板里引用组 0在原文前后加包装
回调函数接收匹配对象,返回字符串需要判断、查表或调用外部逻辑
替换模板里的反斜杠由正则替换语法解释,而普通字符串会先做一遍转义解释,两层叠加容易出错:写替换模板时统一使用原始字符串,可以避免绝大多数字面量与引用混淆的问题。
替换次数是从左到右计数的,因此「只替换第一处」的含义是最左边那一处,而不是最有业务意义的那一处;需要按语义挑选目标时,先用查找接口定位,再做定点替换。

易错点

  • 替换模板用普通字符串:反斜杠先被字符串层解释,引用失效或直接抛错,表现为替换结果与预期不符
  • 把其他语言的引用写法搬过来:不同语言的替换引用语法不一致,混用会得到字面文本而不是组内容
  • 回调函数签名写错:应接收单个匹配对象并返回字符串,返回非字符串会抛类型错误
  • 对结构化文本做全局替换:HTML、JSON、配置片段被替换后可能变成非法结构,应解析后再改
  • 忘记替换是有序的:前一次替换的结果会成为后一次匹配的输入,多轮替换时顺序会影响最终结果

数据来源与参考

  • Python 官方文档 re 模块:sub 与 subn 接口说明
  • Python 官方文档 re 模块:替换模板中的组引用
  • Python 官方文档 re 模块:匹配对象的 group 与 expand 接口

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/python-re-sub-replace.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌‌‌​​‌​‌‌‌​‌​​​‌‌​‌​​​​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​‌​‌‌​​​‌​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​