【问题标题】:Is there a way to refer to the entire matched expression in re.sub without the use of a group?有没有办法在不使用组的情况下引用 re.sub 中的整个匹配表达式?
【发布时间】:2014-10-02 15:29:44
【问题描述】:

假设我想在所有出现的特定表达式前面加上一个字符,例如\

sed 中,它看起来像这样。

 echo '__^^^%%%__FooBar' | sed 's/[_^%]/\\&/g'

注意& 字符用于表示原始匹配表达式。

我查看了regex docsregex howto,但我没有看到可用于替换匹配表达式的& 字符的等效项。

我发现的唯一解决方法是使用一组额外的() 对表达式进行分组,然后引用该组,如下所示。

import re


line = "__^^^%%%__FooBar"
print re.sub("([_%^$])", r"\\\1", line)

有没有一种简洁的方法来引用整个匹配的表达式而无需创建额外的组?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    来自docs

    后向引用 \g<0> 替换了 RE 匹配的整个子字符串。

    例子:

    >>> print re.sub("[_%^$]", r"\\\g<0>", line)
    \_\_\^\^\^\%\%\%\_\_FooBar
    

    【讨论】:

    • 你的眼睛真好。我完全错过了段落末尾的那句话。 :) 将在几分钟内接受。
    【解决方案2】:

    您也可以使用Positive lookahead 获得结果。

    >>> print re.sub("(?=[_%^$])", r"\\", line)
    \_\_\^\^\^\%\%\%\_\_FooBar
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2021-10-09
      • 2018-06-02
      • 2019-07-07
      • 1970-01-01
      相关资源
      最近更新 更多