2016-04-28 10 views
1

string.Template.safe_substitute(...)を使用して、文字列内のキーを所定の辞書で置き換えています。それらの文字列には、キーではないので置き換えたくないdouble $文字を含むことがあります。

:私はactualy辞書で keyが与えられた文字列内の任意の $keyと一致しないと、その関数のドキュメントが言うので、文字列を変更しないことが予想

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

は、次の例を考えます

元のプレースホルダは、そのままの結果の文字列に表示されます。また、substitute()とは異なり、$の他の出現はValueErrorを発生させる代わりに$を返すだけです。

しかし代わりに$の1つが削除されました。何故ですか?

答えて

2

:ワンworkarroundソリューションは、あなたの文字列にすることは非常にそうなものを使用して、二重のドルを交換するだろう

$$はエスケープです。それは単一の$に置き換えられます。

あなたは2 $を維持したい場合は、それを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

正規表現がちょうど(それらは、テンプレートトークンを予約されているので、理解しやすい)ものを、二重ドル記号をサポートするために行われていないようです。 documentationが言うように

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

パーサは$$を見て、それが$barが有効なキーではないことを見る前$に置き換えます。これは、厳密に必要でない状況で$$の処理を一貫して行います。

関連する問題