2013-10-29 34 views

答えて

0

私が使用して単純な回避策のビット:検索文字列が存在しない場合でも、これは文句を言わないto_replace辞書で複数のキーを容易に拡張することができ

my_string = 'Hello {name}, my name is {my_name}!' 

to_replace = { 
    "search_for" : "replace_with", 
    "name" : "minerz029", 
} 

for search_str in to_replace: 
    my_string = my_string.replace('{' + search_str + '}', to_replace[search_str]) 

print(my_string) 

は文句を言います。それはおそらく.format()の機能の多くを提供するために改善することができたが、それは私のために十分であった。

14

は、あなたが見ることができるように、一度フォーマットした後、外{}を除去し、{{my_name}}{my_name}になっている、この

>>> my_string = 'Hello {name}, my name is {{my_name}}!' 
>>> my_string.format(name='minerz029') 
'Hello minerz029, my name is {my_name}!' 

のように、二重の中括弧を使用してmy_nameをエスケープすることができます。後でmy_nameをフォーマットしたい場合は、この

>>> my_string = 'Hello {name}, my name is {{my_name}}!' 
>>> my_string = my_string.format(name='minerz029') 
>>> my_string 
'Hello minerz029, my name is {my_name}!' 
>>> my_string.format(my_name='minerz029') 
'Hello minerz029, my name is minerz029!' 
+1

しかし、後で '.format()' 'my_name'する必要があります。 – minerz029

6

Python3.2 +はformat_mapを持っているように、あなたは単にあなたがそれを余分に追加する必要はありませんさて、この

>>> class D(dict): 
...  def __missing__(self, k):return '{'+k+'}' 
... 
>>> my_string = 'Hello {name}, my name is {my_name}!' 
>>> my_string.format_map(D(name='minerz029')) 
'Hello minerz029, my name is {my_name}!' 
>>> _.format_map(D(my_name='minerz029')) 
'Hello minerz029, my name is minerz029!' 

を行うことができますされ、再びそれをフォーマットすることができ{} @stevehaが指摘するように、あなたはDに提供のみキーが古いのpython3上にある場合、あなたはまだ

を使用することができ、

に置換されます0

my_string.format(**D(name='minerz029')) 
+0

これをテストしたばかりで、 'str.format_map(d)'を使う必要はありません。あなたは 'str.format(** d)'を使うことができ、うまく動作します。しかし、 '.format_map()'は、dictのコピーを作る必要がないので、より効率的です。 – steveha

+0

@stevehaは、Python2でまだ 'dict'に変換しますが、Python3では正常に動作します –

+0

右... Python3でテストしました。 Python2には '.format_map()'はありません。私はちょうど '.format_map()'を持つPythonのバージョンでは、代わりに 'str.format(** d)'を実際に使うことができるということを意味しています。それを綴ってくれないのは残念です。 – steveha

関連する問題