如何在 python 字符串中打印文字大括号字符并在其上使用. format?

x = " \{ Hello \} {0} "
print x.format(42)

给我: Key Error: Hello\\

我要打印输出: {Hello} 42

答案

您需要将{{}}加倍:

>>> x = " {{ Hello }} {0} "
>>> print x.format(42)
' { Hello } 42 '

这是Python 文档中有关格式字符串语法的相关部分:

格式字符串包含用花括号{}括起来的 “替换字段”。花括号中不包含的所有内容均视为文字文本,该文本原样复制到输出中。如果需要在文字文本中包含大括号字符,可以通过加倍{{}}来转义。

您可以通过将花括号加倍来逃脱它。

例如:

x = "{{ Hello }} {0}"
print x.format(42)

OP 写了这个评论:

我正尝试出于某种目的格式化小型 JSON,例如: '{"all": false, "selected": "{}"}'.format(data)以获取类似{"all": false, "selected": "1,2"}

在处理 JSON 时经常会出现 “转义括号” 问题。

我建议这样做:

import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)

它比替代方案更清洁,替代方案是:

'{{"all": false, "selected": "{}"}}'.format(data)

当 JSON 字符串比示例复杂时,最好使用json库。

Python 3.6+(2017 年)

在最新版本的 Python 中,将使用f 字符串 (另请参阅PEP498 )。

对于 f 字符串,应该使用双{{}}

n = 42  
print(f" {{Hello}} {n} ")

产生所需的

{Hello} 42

如果您需要在方括号中解析表达式而不是使用文字文本,则需要三组方括号:

hello = "HELLO"
print(f"{{{hello.lower()}}}")

产生

{hello}

尝试这样做:

x = " {{ Hello }} {0} "
print x.format(42)

尝试这个:

x = "{{ Hello }} {0}"

尽管没有更好的效果,但仅供参考,您也可以这样做:

>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42

例如,当有人要打印{argument}时,它可能很有用。它可能比'{{{}}}'.format('argument')更具可读性

请注意,在 Python 2.7 之后,您省略了参数位置(例如,用{}代替{0}

如果您打算做很多事情,最好定义一个实用函数,让您使用任意大括号替代项,例如

def custom_format(string, brackets, *args, **kwargs):
    if len(brackets) != 2:
        raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
    padded = string.replace('{', '{{').replace('}', '}}')
    substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
    formatted = substituted.format(*args, **kwargs)
    return formatted

>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'

请注意,这将适用于括号为长度为 2 的字符串或两个字符串为可迭代的字符串(对于多字符定界符)。

原因是{}.format()的语法,因此在您的情况下.format()无法识别{Hello}因此引发了错误。

您可以使用双大括号 {{}} 覆盖它,

x = " {{ Hello }} {0} "

要么

尝试使用%s进行文本格式设置,

x = " { Hello } %s"
print x%(42)

如果需要在字符串中保留两个大括号,则变量的每一侧都需要 5 个大括号。

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'