在re.sub()中引用匹配分组需用反向引用:数字形式为\1、\2(需双反斜杠或原始字符串),命名组用\g;也可传入函数,通过Match对象的group()方法获取分组内容。

在 re.sub() 中引用匹配到的分组内容,主要靠反向引用语法:\\1、\\2 表示第 1、第 2 个捕获组,\\g 或 \\g 更清晰且支持命名组。
基础数字反向引用(\\1、\\2…)
括号 () 定义的捕获组按左括号出现顺序编号,替换字符串中用 \\1 引用第一个组,依此类推。注意:必须是双反斜杠(Python 字符串中表示一个字面反斜杠)。
-
re.sub(r'(\\d+)-(\\d+)', r'\\2/\\1', '2023-04')→'04/2023' - 如果写成
'\2/\1'(单反斜杠),会触发转义错误或意外行为(如\2被解释为 ASCII 字符)
命名组引用(\\g)
给分组起名后,用 \g 引用,更易读、不怕编号变化,也支持重复引用同一组。
-
re.sub(r'(?P→\\d{4})-(?P \\d{2})', r'\\g /\\g ', '2023-04') '04/2023' -
re.sub(r'(?P→\\w+)', r'【\\g 】', 'hello world') '【hello】 【world】'
在替换函数中获取分组(传入函数作 repl)
当逻辑复杂时,可传入函数作为 repl 参数,函数接收 Match 对象,用 .group(1)、.group('name') 等灵活处理。
def upper_first(m): return m.group(1).upper() + m.group(2)-
re.sub(r'(\\w)(\\w*)', upper_first, 'hello world')→'Hello World' - 函数中还能做条件判断、调用其他逻辑,比纯字符串替换更强大
常见陷阱与提醒
容易出错的地方:
- 忘记对反斜杠转义:写
'\1'是错的,必须写r'\1'或'\\1' - 引用了不存在的组:比如正则没写括号却用了
\\1,会报re.error: invalid group reference - 非捕获组
(?:...)不产生编号,不能被\\1引用 - 在 f-string 或格式化字符串中使用反向引用要格外小心,建议统一用 raw string(
r'')写替换模板










