x = " \{ Hello \} {0} "
print x.format(42)
给了我:Key Error: Hello\\
我想打印输出:{Hello} 42
答案 0 :(得分:1611)
您需要将{{
和}}
加倍:
>>> x = " {{ Hello }} {0} "
>>> print x.format(42)
' { Hello } 42 '
以下是Python documentation for format string syntax的相关部分:
格式字符串包含由大括号
{}
包围的“替换字段”。大括号中未包含的任何内容都被视为文本文本,它将不加改变地复制到输出中。如果您需要在文字文本中包含大括号字符,则可以通过加倍来对其进行转义:{{
和}}
。
答案 1 :(得分:60)
你通过加倍大括号来逃避它。
例如:
x = "{{ Hello }} {0}"
print x.format(42)
答案 2 :(得分:31)
I was trying to format a small JSON for some purposes, like this: '{"all": false, "selected": "{}"}'.format(data) to get something like {"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
库肯定更可取。
答案 3 :(得分:25)
尝试这样做:
x = " {{ Hello }} {0} "
print x.format(42)
答案 4 :(得分:23)
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}
答案 5 :(得分:22)
试试这个:
x = "{{ Hello }} {0}"
答案 6 :(得分:15)
虽然没有任何好处,但仅供参考,您也可以这样做:
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
例如,当有人想要打印{argument}
时,它会很有用。它可能比'{{{}}}'.format('argument')
请注意,在Python 2.7之后省略了参数位置(例如{}
而不是{0}
)
答案 7 :(得分:6)
如果你要做很多事情,最好定义一个实用功能,让你可以使用任意支撑替代品,比如
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的字符串或两个字符串的可迭代(对于多字符分隔符)。
答案 8 :(得分:1)
如果您只想打印花括号的一侧:
a=3
print(f'{"{"}{a}')
>>> {3
答案 9 :(得分:1)
您可以使用“引用墙”将格式化的字符串部分与常规字符串部分分开。
来自:
print(f"{Hello} {42}")
到
print("{Hello}"f" {42}")
一个更清楚的例子是
string = 10
print(f"{string} {word}")
输出:
NameError: name 'word' is not defined
现在,像这样添加引用墙:
string = 10
print(f"{string}"" {word}")
输出:
10 {word}
答案 10 :(得分:1)
我最近遇到了这个问题,因为我想将字符串注入到预先格式化的JSON中。 我的解决方案是创建一个辅助方法,如下所示:
def preformat(msg):
""" allow {{key}} to be used for formatting in text
that already uses curly braces. First switch this into
something else, replace curlies with double curlies, and then
switch back to regular braces
"""
msg = msg.replace('{{', '<<<').replace('}}', '>>>')
msg = msg.replace('{', '{{').replace('}', '}}')
msg = msg.replace('<<<', '{').replace('>>>', '}')
return msg
然后您可以执行以下操作:
formatted = preformat("""
{
"foo": "{{bar}}"
}""").format(bar="gas")
在性能不成问题的情况下完成工作。
答案 11 :(得分:1)
在尝试打印文本时,我偶然发现了此问题,可以将其复制粘贴到Latex文档中。我在this answer上进行扩展,并使用命名的替换字段:
让我们说您要打印出具有诸如
,在Latex中为$A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$
以下代码使用命名字段完成工作,因此对于许多索引来说,它仍然可读:
idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))
答案 12 :(得分:1)
原因是,{}
是.format()
的语法,因此在您的情况下,.format()
无法识别{Hello}
,因此会引发错误。
您可以使用双花括号{{}},
覆盖它x = " {{ Hello }} {0} "
或
尝试%s
进行文字格式化,
x = " { Hello } %s"
print x%(42)
答案 13 :(得分:0)
如果需要在字符串中保留两个大括号,则变量的每一侧都需要5个大括号。
>>> myvar = 'test'
>>> "{{{}}}".format(myvar)
'{{test}}'
答案 14 :(得分:0)
我很晚才参加这个聚会。我成功将方括号放在了替换元素中,如下所示:
#Code
rownumbers <- which(clean.data$Country == "Germany" & clean.data$Effect > 1990)
clean.data$Country[rownumbers] <- "Federal Republic Of Germany"
可打印
print('{0} {1}'.format('{hello}', '{world}'))
严格来说,这不是OP的要求,因为他/她想要格式字符串中的花括号,但这可能对某人有所帮助。
答案 15 :(得分:0)
您可以使用String.Template()
:
from string import Template
s = Template('$txt, $num')
s.substitute(txt='{Hello}', num='42 ')
答案 16 :(得分:0)
我使用了双 {{}} 来防止 fstring 值注入,
例如,这里是我的 Postgres UPDATE 语句来更新一个整数数组列,该列使用 {} 的表达式来捕获数组,即:
端口 = '{100,200,300}'
使用 fstrings,
ports = [1,2,3]
query = f"""
UPDATE table SET ports = '{{{ports}}}' WHERE id = 1
"""
实际的查询语句将是,
UPDATE table SET ports = '{1,2,3}'
这是一个有效的 postgres 语句
答案 17 :(得分:0)
您可以避免通过将 f 字符串仅用于您希望应用 f-magic 的字符串部分来避免将大括号加倍,并使用所有文字的常规字符串。让python通过将多个字符串堆叠在一起来为您完成字符串连接。
number = 42
print(" { Hello }"
f" {number} "
"{ thanks for all the fish }")
### OUTPUT:
{ Hello } 42 { thanks for all the fish }
<块引用>
注意:不需要换行。我只是为了使它更具可读性而放置它们。你也可以把它写成 "{Hello}"f"{number}"
。
答案 18 :(得分:-1)
如果您只想只打印一个大括号(例如{
),则可以使用{{
,并且以后可以在字符串中添加更多大括号。
例如:
>>> f'{{ there is a curly brace on the left. Oh, and 1 + 1 is {1 + 1}'
'{ there is a curly brace on the left. Oh, and 1 + 1 is 2'
答案 19 :(得分:-1)
如果需要在可以格式化的 f-string 模板中使用花括号,则需要在 f-string 的一组花括号中输出包含两个花括号的字符串:
css_template = f"{{tag}} {'{{'} margin: 0; padding: 0;{'}}'}"
for_p = css_template.format(tag="p")
# 'p { margin: 0; padding: 0;}'
答案 20 :(得分:-1)
或者只是参数化支架本身?可能非常冗长。
x = '{open_bracket}42{close_bracket}'.format(open_bracket='{', close_bracket='}')
print(x)
# {42}
答案 21 :(得分:-2)
当您只是想插入代码字符串时,我建议您使用jinja2,它是Python的全功能模板引擎,即:
from jinja2 import Template
foo = Template('''
#include <stdio.h>
void main() {
printf("hello universe number {{number}}");
}
''')
for i in range(2):
print(foo.render(number=i))
因此不会像其他答案那样强迫您复制花括号
答案 22 :(得分:-4)
您可以使用原始字符串方法,只需在字符串前添加不带引号的字符“ r”即可。
# to print '{I am inside braces}'
print(r'{I am inside braces}')
答案 23 :(得分:-4)
使用转义序列转义f字符串中的花括号。例如:print(f'{a = {1}}')