2013-10-29 91 views
6

是否可以使用Python的str.format(key=value)語法來替換特定的鍵。如何轉義格式字符串?

考慮這個例子:

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

my_string = my_string.format(name='minerz029') 

返回

KeyError: 'my_name' 

有沒有辦法來實現這一目標?

回答

0

一個簡單的解決辦法,我使用了一下:

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) 

這可以很容易地在to_replace字典多個鍵擴大和不會抱怨,即使搜索字符串不存在。它可能會改進,以提供更多的.format()的功能,但它對我來說已經足夠了。

14

您可以使用雙大括號,這樣

>>> 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_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!' 

現在是沒有必要添加額外的{} ,只有你提供D各鍵將被取代

由於@steveha指出,如果你是在一箇舊Python3,你仍然可以使用

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

我剛測試過這個,你不需要使用'str.format_map(d)';你可以使用'str.format(** d)',它工作得很好。但是'.format_map()'更高效,因爲它不需要複製字典。 – steveha

+0

@steveha,在Python2中仍將其轉換爲'dict',但它對Python3正常工作 –

+0

正確...我在Python3中進行了測試。 Python2沒有'.format_map()'。我的意思是,在具有'.format_map()'的Python版本中,您實際上可以使用'str.format(** d)',而且它也可以工作。對不起,沒有拼寫出來。 – steveha

相關問題