17370845950

re.sub() 替换时如何引用匹配到的分组内容( g 等)
在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', '2025-04')'04/2025'
  • 如果写成 '\2/\1'(单反斜杠),会触发转义错误或意外行为(如 \2 被解释为 ASCII 字符)

命名组引用(\\g

给分组起名后,用 \g 引用,更易读、不怕编号变化,也支持重复引用同一组。

  • re.sub(r'(?P\\d{4})-(?P\\d{2})', r'\\g/\\g', '2025-04')'04/2025'
  • 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'')写替换模板