假设我想在\
之类的字符前面添加特定表达式的所有实例。
在sed
中,它看起来像这样。
echo '__^^^%%%__FooBar' | sed 's/[_^%]/\\&/g'
请注意,&
字符用于表示原始匹配表达式。
我查看了regex docs和regex howto,但我没有看到可用于在匹配表达式中替换的&
字符的等效字符。
我找到的唯一解决方法是使用一组额外的()
对表达式进行分组,然后引用该组,如下所示。
import re
line = "__^^^%%%__FooBar"
print re.sub("([_%^$])", r"\\\1", line)
在没有额外创建群组的情况下,是否有一种干净的方式来引用整个匹配的表达式?
答案 0 :(得分:8)
来自docs:
反向引用
\g<0>
替代RE匹配的整个子字符串。
示例:
>>> print re.sub("[_%^$]", r"\\\g<0>", line)
\_\_\^\^\^\%\%\%\_\_FooBar
答案 1 :(得分:4)
您也可以使用Positive lookahead获得结果。
>>> print re.sub("(?=[_%^$])", r"\\", line)
\_\_\^\^\^\%\%\%\_\_FooBar