python re.sub 组:\number 之后的数字

Posted

技术标签:

【中文标题】python re.sub 组:\\number 之后的数字【英文标题】:python re.sub group: number after \numberpython re.sub 组:\number 之后的数字 【发布时间】:2011-08-24 11:40:36 【问题描述】:

如何将foobar 替换为foo123bar

这不起作用:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

这行得通:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

我认为在拥有\number 之类的内容时这是一个常见问题。谁能给我一个关于如何处理这个问题的提示?

【问题讨论】:

此问题已添加到Stack Overflow Regular Expression FAQ 的“群组”下。 这个问题花了我很长时间才找到,因为它没有“捕获组”或“编号组参考”这样的术语,但我终于来了,很高兴你问到它。 您的问题是 r'\112' 被解释为八进制文字 0112、ASCII'J' 或十进制 74。看不到如何强制反向引用 '\1' 获取在字符串连接之前评估或''.join() 与问题的小偏差,以任何方式引用所有组匹配,即 r'\hi'? 【参考方案1】:

答案是:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

文档的相关摘录:

除了字符转义和 如上所述的反向引用, \g 将使用子字符串 由名为 name 的组匹配,如 由 (?P...) 语法定义。 \g 使用对应的 组号; \g 因此是 等价于 \2,但不是模棱两可的 在诸如 \g0 之类的替换中。 \20 将被解释为参考 第 20 组,不是对第 2 组的引用 后跟文字字符“0”。 反向引用 \g 替换为 匹配的整个子字符串 回复。

【讨论】:

别对自己太苛刻了。 buried in the documentation 的深度如此之深,以至于大多数人阅读文档所花费的时间要比在谷歌上搜索他们的问题并在 SO 上得到这个答案要花费更多的时间。 如果您正在寻找上下文,请在here 找到所提供的确切报价 可以拿组修改吗? \g ... 例如在这种情况下 g 是 foo,但我想将 o 更改为 u,就像这个“fuu” @EricBellet 您很可能必须在几行内完成。即使可以将它排成一条线,维护起来也不容易,值得冒险。如果您正在玩代码高尔夫,那么有一种方法可以使用命名组有条件地匹配和引用匹配的字符,例如在 Python 中查找单引号或双引号文本,您可以执行 (?P&lt;q&gt;['"])(.*)(?P=q) 其中 (?P=q) 引用命名的群组(?P&lt;q&gt;['"])。例如,如果第一个字符是单引号,则最后一组将只匹配单引号。

以上是关于python re.sub 组:\number 之后的数字的主要内容,如果未能解决你的问题,请参考以下文章

Python - re.sub 返回模式而不是替换

在 re.sub 替换模式中处理对捕获组的反向引用

Python 基础之re 模块

python re.sub

python常用模块之re模块(正则)

python re 与 re.sub替换部分文件