re.sub 替换为匹配的内容

Posted

技术标签:

【中文标题】re.sub 替换为匹配的内容【英文标题】:re.sub replace with matched content 【发布时间】:2011-11-03 16:59:34 【问题描述】:

为了掌握 Python 中的正则表达式,我试图输出一些在 URL 的一部分中突出显示的 html。我的意见是

images/:id/size

我的输出应该是

images/<span>:id</span>/size

如果我在 javascript 中这样做

method = 'images/:id/size';
method = method.replace(/\:([a-z]+)/, '<span>$1</span>')
alert(method)

我得到了想要的结果,但是如果我在 Python 中这样做

>>> method = 'images/:id/huge'
>>> re.sub('\:([a-z]+)', '<span>$1</span>', method)
'images/<span>$1</span>/huge'

我不知道,如何让 Python 返回正确的结果而不是 $1re.sub 甚至是执行此操作的正确函数吗?

【问题讨论】:

【参考方案1】:

使用\1 而不是$1

\number 匹配同号组的内容。

http://docs.python.org/library/re.html#regular-expression-syntax

【讨论】:

【参考方案2】:

只需使用\1 而不是$1

In [1]: import re

In [2]: method = 'images/:id/huge'

In [3]: re.sub(r'(:[a-z]+)', r'<span>\1</span>', method)
Out[3]: 'images/<span>:id</span>/huge'

还要注意对正则表达式使用raw strings (r'...')。这不是强制性的,但消除了转义反斜杠的需要,可以说使代码更具可读性。

【讨论】:

对于那些正在寻找此示例并想知道为什么它在您的测试中失败的人,请确保在组字符串之前添加 r(字符 'r') r 说明符也是这个答案帮助我解决的问题。 \g&lt;0&gt; 在没有匹配组时起作用,即对于像':[a-z]+' 这样的非分组正则表达式。直接来自docs.python.org/3/library/re.html#re.sub 有没有办法在替换之前修改 \1 中的内容?【参考方案3】:

对于替换部分,Python 使用\1 sed 和 vi 的方式,不是 $1 Perl、Java 和 Javascript(以及其他)方式。此外,由于\1 在常规字符串中插入为字符 U+0001,因此您需要使用原始字符串或将其转义。

Python 3.2 (r32:88445, Jul 27 2011, 13:41:33) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> method = 'images/:id/huge'
>>> import re
>>> re.sub(':([a-z]+)', r'<span>\1</span>', method)
'images/<span>id</span>/huge'
>>> 

【讨论】:

【参考方案4】:

对整个匹配值的反向引用是\g&lt;0&gt;,参见re.sub documentation:

反向引用 \g&lt;0&gt; 替换为 RE 匹配的整个子字符串。

见Python demo:

import re
method = 'images/:id/huge'
print(re.sub(r':[a-z]+', r'<span>\g<0></span>', method))
# => images/<span>:id</span>/huge

【讨论】:

\g&lt;1&gt; 等也是有效的,提供了一种替换为 \11(\1 和数字 1)而不是捕获组 11 的方法。 @Orwellophile 是的,这种语法允许使用所有的反向引用,而不仅仅是 Group 0。

以上是关于re.sub 替换为匹配的内容的主要内容,如果未能解决你的问题,请参考以下文章

re.sub

re.sub 不替换匹配 [重复]

python 正则表达式re.sub()提取字符串以及去除空格

字符串正则匹配替换

Python正则替换字符串函数re.sub用法示例

python字符串替换之re.sub()