2014-10-02 36 views
4

假设我想用一个字符(例如\)预先计算特定表达式的所有出现位置。有没有办法在不使用组的情况下引用re.sub中的完整匹配表达式?

sed,它看起来像这样。

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

注意,&字符用来表示原始匹配的表达式。

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

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

import re 


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

有引用整个匹配的表达式没有额外的组创建一个干净的方式?

回答

8

docs

反向引用\g<0>代用品在由RE匹配整个串。

例子:

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

你的眼睛真的很好。我完全错过了该段末尾的那句话。 :)几分钟后会接受。 – merlin2011 2014-10-02 07:23:53

4

您可以通过使用Positive lookahead得到的结果也。

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

+1另外一个非常有见地的解决方案。 :) – merlin2011 2014-10-02 07:26:13

相关问题