使用替换函数时,为什么反向引用不能在Python的re.sub中工作?

amc*_*abb 5 python regex python-2.7

re.sub在Python 2.7中使用,以下示例使用简单的反向引用:

re.sub('-{1,2}', r'\g<0> ', 'pro----gram-files')
Run Code Online (Sandbox Code Playgroud)

它按预期输出以下字符串:

'pro-- -- gram- files'
Run Code Online (Sandbox Code Playgroud)

我希望以下示例相同,但它不是:

def dashrepl(matchobj):
    return r'\g<0> '
re.sub('-{1,2}', dashrepl, 'pro----gram-files')
Run Code Online (Sandbox Code Playgroud)

这会产生以下意外输出:

'pro\\g<0> \\g<0> gram\\g<0> files'
Run Code Online (Sandbox Code Playgroud)

为什么这两个例子给出不同的输出?我是否遗漏了解释此问题的文档?这种行为是否比我预期的更好?有没有办法在替换函数中使用反向引用?

glg*_*lgl 5

由于有更简单的方法来实现您的目标,您可以使用它们.

正如您已经看到的那样,您的替换函数会获取匹配对象作为参数.

除其他外,该对象具有group()可以替代使用的方法:

def dashrepl(matchobj):
    return matchobj.group(0) + ' '
Run Code Online (Sandbox Code Playgroud)

这将给出你的结果.


但你完全正确 - 文档有点令人困惑:

他们描述了这个repl论点:

repl可以是字符串或函数; 如果它是一个字符串,则处理其中的任何反斜杠转义.

如果repl是函数,则会针对模式的每个非重叠事件调用它.该函数接受单个匹配对象参数,并返回替换字符串.

可以解释这个,好像函数返回的"替换字符串"也适用于反斜杠转义的处理.

但由于此处理仅针对"它是一个字符串"的情况进行描述,因此它变得更清晰,但乍一看并不明显.