【问题标题】:How can I escape the format string?如何转义格式字符串?
【发布时间】:2013-10-29 04:01:59
【问题描述】:

是否可以使用 Python 的 str.format(key=value) 语法仅替换某些键。

考虑这个例子:

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

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

返回

KeyError: 'my_name'

有没有办法做到这一点?

【问题讨论】:

    标签: python string string.format


    【解决方案1】:

    你可以像这样使用双花括号转义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_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!'
    

    【讨论】:

      【解决方案2】:

      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'))
      

      【讨论】:

      • 这个我刚测试过,不用str.format_map(d);你可以使用str.format(**d),它工作得很好。但是,.format_map() 效率更高,因为它不需要复制 dict。
      • @steveha,在 Python2 中仍将其转换为 dict,但它适用于 Python3
      • 对...我在 Python3 中测试过。 Python2 没有.format_map()。我的意思是,在具有.format_map() 的Python 版本中,您实际上可以使用str.format(**d),它也可以工作。抱歉没有说清楚。
      • 在此处使用定义__missing__dict 子类是最优雅的解决方案。
      【解决方案3】:

      我使用了一个更简单的解决方法:

      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 dict 中的更多键轻松扩展,即使搜索字符串不存在也不会抱怨。它可能会被改进以提供更多.format() 的功能,但对我来说已经足够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 2013-09-22
        • 2019-03-14
        • 2023-03-30
        相关资源
        最近更新 更多