Python正则表达式替换:将反向引用与数字分开

16
在正则表达式替换模式中,反向引用看起来像是\1。如果你想在该反向引用后包含一个数字,那么这将失败,因为该数字被认为是反向引用编号的一部分:

在正则表达式替换模式中,反向引用看起来像是\1。如果您想在该反向引用后包含数字,这将会失败,因为该数字被视为反向引用编号的一部分:

# replace all twin digits by zeroes, but retain white space in between
re.sub(r"\d(\s*)\d", r"0\10", "0 1")
>>> sre_constants.error: invalid group reference

替换模式r"0\1 0"可以正常工作,但在失败的示例中,反向引用\1被解释为\10

如何将数字'0'与它前面的反向引用\1分开?


这里发生了什么? - aldeb
@segfolt他提出了问题并回答了自己 - 完全合法。 - Inbar Rose
@segfolt florisla可能想要提出一个问题并自己解决它。 - Jerry
啊,好的。我在 Stack Overflow 上还比较新,所以不知道这是可能的事情。 - aldeb
我在输入问题时找到了解决方案。因此,我使用了“回答自己的问题”复选框。 - florisla
我喜欢两个答案,所以我给两个点赞。很好的问答! - Patashu
2个回答

19
您可以使用在文档中提到的 \g<1> 来进行替换操作。

典型的情况是没有彻底阅读文档,谢谢。 - florisla

12

不必使用带有序列号(\1)的反向引用,可以使用命名组来解决问题:

使用命名组,问题就可以得到解决。

# replace all twin digits by zeroes, but retain whitespace in between
re.sub(r"\d(?P<whitespace>\s*)\d", r"0\g<whitespace>0", "0 1")
>>> '0 0'

事实证明,这个技巧实际上在re.sub的文档中有描述。

(Turns out this trick is in fact described in the documentation of re.sub.)

不要忘记接受自己的答案 :)(我认为有时间限制,但我不确定) - TerryA
没错,有一个两天的时间限制。 - florisla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接