使用.format(或f-string)时,如何在字符串中转义花括号({})字符?

2483

无法工作的示例:

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

期望得到的输出:

 {Hello} 42 

1
参见:https://dev59.com/KVsV5IYBdhLWcg3w-i0C - dreftymac
26
想避免使用双花括号 ({{ }}) 的人可以使用 string.Template。在那里,您可以替换形式为 $foo 的标识符(方便生成 LaTeX 代码)。 - 0 _
2
对于那些想要避免双重大括号的人,而且不介意在他们的Python项目中添加另一个依赖项的人,也可以使用Jinja2来解决这个问题,它允许用户定义自定义占位符分隔符语法。 - dreftymac
23个回答

3300

您需要将{{}}加倍:

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

以下是Python格式化字符串语法的相关部分:

格式化字符串包含用大括号{}括起来的“替换字段”。不在大括号中的任何内容都被视为文本,将不加修改地复制到输出中。如果需要在文本中包含大括号字符,则可以通过两次输入来转义:{{}}


385
如果你想打印出"{42}",你可以使用"{{{0}}}".format(42)! - hughes
21
如果你想要一个单独的花括号怎么办?"{ something { } {value}".format(42)是不能正常工作的。 - AJP
28
"{{".format()和"}}".format()会打印出单个大括号。例如,当你使用以下代码:print "{{ something {{ }} {0}".format(42)时,会打印出"{ something { } 42}"。请注意,翻译过程中不能改变原文的含义,只需把内容更加通俗易懂即可。 - Mark Visser
3
"{0}"的意思是什么? - CodyBugstein
10
@Imray: {0} 参照的是 .format() 中的第一个参数。只要在 .format() 中提供相同数量的参数,就可以像 {0} {1} {2} 这样打印多个值。请参考http://docs.python.org/library/string.html#format-examples获取更多示例。 - Greg Hewgill
显示剩余10条评论

253

Python 3.6+ (2017)

在Python的最近版本中,人们通常会使用f-strings(请参见PEP498)。

使用f-strings时应该使用双重{{}}

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

产生所期望的结果

 {Hello} 42

如果你需要解析括号内的表达式而不是使用文字,你需要三组括号:

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

产生

{hello}

2
my_greet = "HELLO",你可以使用仅有的两组大括号,通过 print(f"{ {my_greet.lower()} }") 得到 {hello} 作为输出。在大括号之间留一个空格即可。 - yrnr
1
如果你正在使用Python3.6+并且处于疫情时期,那么这应该是现在被接受的答案。 - Gwi7d31
@Gwi7d31 不,f-strings并不能替代str.format()。例如,我写的这个答案使用f-strings是不可能的,因为模板来自于输入而不是源代码。 - wjandrea
1
@wjandrea,你的链接实际上与OP的问题无关。 OP想要保留花括号,而你在链接答案中通过.format()和字典展开方法将它们删除了。 如果您想在Python 3.6+中保留{}并向字符串插入值,则“这是方式”。 这就是问题所在。 我也从未说过f-strings可以替代.format()。那是你说的。 - Gwi7d31
@Gwi 我的意思是,这个问题是关于 str.format() 而不是 f-strings,它们不是相互兼容的。 - wjandrea
所以基本上只需不断添加花括号,直到它正常工作。明白了。 - Patrick

115

你可以通过将大括号翻倍来转义它。

例如:

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

81

您想使用字符 {} 格式化字符串

您只需要将它们加倍。

使用 f'{{' 格式化 {,使用 f'}}' 格式化 }

因此:

name = "bob"
print(f'Hello {name} ! I want to print }} and {{ or {{ }}')

输出:

你好,Bob!我想要打印 } 和 { 或 { }

或者精确的例子:

number = 42
print(f'{{Hello}} {number}')

将打印:

{你好} 42

最后:

number = 42
string = "bob"
print(f'{{Hello}} {{{number}}} {number} {{{string}}} {string} ')

{你好} {42} 42 {鲍勃} 鲍勃


68

原评论如下:

我试图为某些目的格式化一个小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 库是绝对可取的。


1
阿门!这可能看起来更费力,但是使用库来完成库应该做的事情,而不是走捷径...会使得事情变得更好。 - Kaolin Fire
1
但是,在 Python 对象中键的顺序并不保证相同... 不过,JSON 库保证以一种 JSON 方式进行序列化。 - wizzwizz4
2
wizzwizz4: 很好的观点。从Python 3.6开始,字典是插入有序的,所以这不会成为问题。在Python 2.7和3.5之间的版本可以使用collections库中的OrderedDict。 - twasbrillig
1
如果例如 data = 'foo"',那么另一种选择也是非常错误的,因为 data 值中的 " 无法被正确转义。 - chepner
1
如果你正在处理 JSON,这个答案适用于你。在可读性和可维护性方面获得胜利 - 想象一下处理复杂的 JSON 结构和其中大量的双括号。 - panK

39

尝试这样写:

x = "{{ 你好 }} {0}"


31

试着这样做:

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

16

虽然并没有更好,只是供参考,你也可以这样做:

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

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

请注意,在Python 2.7之后省略参数位置(例如{}而不是{0})。


12
key = "FOOBAR"
print(f"hello {{{key}}}")

输出

hello {FOOBAR}

如果有人想使用f字符串打印花括号内的内容。


12

f-strings (python 3)

你可以使用 f-strings 来避免在字符串中使用双花括号,只需将 f-strings 仅应用于希望应用 f-魔法的字符串部分,并对所有字面值和可能包含“不安全”特殊字符的内容使用常规(愚蠢的)字符串。通过将多个字符串堆叠在一起,让 Python 来进行字符串连接

number = 42
print(" { Hello }"  
f" {number} " 
"{ thanks for all the fish }")

### OUTPUT:
{ Hello } 42 { thanks for all the fish }

NOTE: Line breaks between the strings are NOT required. I have only added them for readability. You could as well write the code above as shown below:

⚠️ WARNING: This might hurt your eyes or make you dizzy!

print("{Hello}"f"{number}""{thanks for all the fish}")

2
隐式字符串连接不被鼓励使用。Guido从C语言中复制了这个特性,但它在Python中并没有真正的必要性。- https://groups.google.com/g/python-ideas/c/jP1YtlyJqxs?pli=1 - ankit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接