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

时间:2011-03-29 00:04:53

标签: python string format string-formatting curly-braces

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

给了我:Key Error: Hello\\

我想打印输出:{Hello} 42

24 个答案:

答案 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)

OP写了这篇评论:

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上进行扩展,并使用命名的替换字段:

让我们说您要打印出具有诸如 enter image description here,在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'
>>> "{{{enter image description here}}}".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 字符串 (python 3)

您可以避免通过将 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}}')