使用匹配的内容替换 re.sub

为了掌握 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 返回正确的结果而不是 $1呢?re.sub是做这件事的正确函数吗?

121732 次浏览

使用 \1代替 $1

数字与同一数字组的内容相匹配。

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

简单地使用 \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'

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

对于替换部分,Python 采用 sed 和 vi 的方式使用 \1,采用 Perl、 Java 和 Javascript (等等)的方式使用 没有$1。此外,由于 \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'
>>>

对整个匹配值的反向引用是 \g<0>,参见 re.sub文档:

反向引用 \g<0>在与 RE 匹配的整个子字符串中替换。

参见 Python 演示:

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

如果需要执行不区分大小写的搜索,请添加 flag=re.I:

re.sub(r':[a-z]+', r'<span>\g<0></span>', method, flags=re.I)