2016-04-28 59 views
1

我使用string.Template.safe_substitute(...)來替換字符串中的鍵由給定的字典。這些字符串可能包含雙重$字符,我不想被替換,因爲它們不是鍵。

考慮下面的例子:

>>> Template("foo$$bar").safe_substitute({"key":"val"}) 
'foo$bar' 

我actualy預期不改變的字符串,因爲key在字典中不匹配給定字符串中的任何$key和該功能的文件說:

原來的佔位符將在結果字符串中出現完好無損。另外,與substitute()不同,$的任何其他外觀只會返回$而不是引發ValueError。

但是取而代之的是$之一。這是爲什麼?

回答

2

正如documentation說:

$$是一種逃避;它被替換爲一個$。

如果你想保持2 $你需要轉義兩次:

>>> Template("foo$$$$bar").safe_substitute({"key":"val"}) 
'foo$$bar' 
+0

呵呵,我總是閱讀函數定義但總是錯過了上半部分。 – ap0

2

string.Template類使用正則表達式內部來分析模板參數:https://hg.python.org/cpython/file/tip/Lib/string.py#l54

似乎正則表達式只是沒有作出支持這些雙美元符號(這是可以理解的,因爲它們是保留模板標記) 。

一個workarround的解決辦法是用一些不太可能取代你的雙元在你的字符串:

Template("foo$$bar".replace("$$", "DOUBLE_DOLLAR")).safe_substitute(...).replace("DOUBLE_DOLLAR", "$$") 
2

解析器看到$$和它看到$bar是不是一個有效的密鑰之前$替換它。這使得$$的處理在不是絕對必要的情況下是一致的