我正在使用string.Template.safe_substitute(...)
来替换给定字典中字符串中的键。这些字符串可能包含双$
字符,我不想替换它们,因为它们不是键。
给出以下示例:
>>> Template("foo$$bar").safe_substitute({"key":"val"})
'foo$bar'
我实际上预计字符串不会被更改,因为字典中的key
与给定字符串中的任何$key
都不匹配,并且该函数的文档说:
原始占位符将在结果字符串中完整显示。此外,与substitute()不同,$的任何其他外观只会返回$而不是引发ValueError。
但是其中一个$
被删除了。这是为什么?
答案 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
。这使$$
的处理在不严格必要的情况下保持一致