2014-10-02 26 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

相關問題