5

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

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

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

'pro-- -- gram- files'

我希望以下示例是相同的,但事实并非如此:

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

这给出了以下意外输出:

'pro\\g<0> \\g<0> gram\\g<0> files'

为什么这两个示例给出不同的输出?我是否错过了解释这一点的文档中的某些内容?有什么特别的原因表明这种行为比我预期的更可取吗?有没有办法在替换函数中使用反向引用?

4

2 回答 2

5

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

正如您已经看到的,您的替换函数获取一个匹配对象作为它的参数。

这个对象有一个group()可以代替使用的方法:

def dashrepl(matchobj):
    return matchobj.group(0) + ' '

这将给出你的结果。


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

他们描述了这个repl论点:

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

Ifrepl是一个函数,每次出现不重叠的模式时都会调用它。该函数采用单个匹配对象参数,并返回替换字符串。

可以将此解释为函数返回的“替换字符串”也适用于反斜杠转义的处理。

但是由于这个处理只针对“它是一个字符串”的情况来描述,它变得更加清晰,但乍一看并不明显。

于 2012-10-18T16:14:36.247 回答
4

如果您将函数传递给re.sub,它允许您将匹配项替换为从函数返回的字符串。基本上,re.sub根据您传递的是函数还是字符串,使用不同的代码路径。是的,这实际上是可取的。考虑要替换with 的匹配项和foowith的bar匹配项的baz情况qux。然后你可以把它写成:

repdict = {'foo':'bar','baz':'qux'}
re.sub('foo|baz',lambda match: repdict[match.group(0)],'foo')

你可以争辩说你可以在 2 次通过中做到这一点,但你不能这样做,如果repdict看起来像{'foo':'baz','baz':'qux'}

而且我认为您不能通过反向引用来做到这一点(至少不容易)。

于 2012-10-18T16:08:29.477 回答