Python string.Template删除double $

时间:2016-04-28 15:14:55

标签: python

我正在使用string.Template.safe_substitute(...)来替换给定字典中字符串中的键。这些字符串可能包含双$字符,我不想替换它们,因为它们不是键。

给出以下示例:

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

我实际上预计字符串不会被更改,因为字典中的key与给定字符串中的任何$key都不匹配,并且该函数的文档说:

  

原始占位符将在结果字符串中完整显示。此外,与substitute()不同,$的任何其他外观只会返回$而不是引发ValueError。

但是其中一个$被删除了。这是为什么?

3 个答案:

答案 0 :(得分: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", "$$")

答案 1 :(得分:2)

正如documentation所说:

  

$$是一个逃脱;它被替换为单个$。

如果你想保留2 $,你需要逃避它两次:

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

答案 2 :(得分:2)

解析器在看到$$不是有效密钥之前会看到$并将其替换为$bar。这使$$的处理在不严格必要的情况下保持一致