【问题标题】:re.sub replace with matched contentre.sub 替换为匹配的内容
【发布时间】: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 甚至是执行此操作的正确函数吗?

【问题讨论】:

    标签: python regex re python-regex


    【解决方案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。
        猜你喜欢
        • 2019-06-08
        • 2012-08-15
        • 2019-05-16
        • 2015-12-18
        • 2022-12-04
        • 2022-11-29
        • 2014-06-26
        相关资源
        最近更新 更多