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


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

给我 : Key Error: Hello\\

我想打印输出: {Hello} 42



9
对于那些想要避免花括号({{ }})加倍的人,请使用string.Template。在那里,您可以替换形式的标识符$foo(用于生成LaTeX代码)。
Ioannis Filippidis

对于那些想要避免花括号加倍并且不反对在其Python项目中添加另一个依赖项的人,还有Jinja2通过允许用户定义的自定义占位符定界符语法来最终解决此问题。
dreftymac

Answers:


2066

您需要将{{和加倍}}

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

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

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


264
因此,如果要打印“ {42}”,请使用"{{{0}}}".format(42)
拥抱

7
如果您想要一个大括号怎么办? "{ something { } {value}".format(42)不起作用。
AJP

14
“ {{” .format()和“}}”。format()打印单个大括号。在您的示例中:打印“ {{某物{{}} {0}”。format(42)将打印“ {某物{} 42”。
马克·维瑟

2
什么{0}意思
CodyBugstein 2014年

6
@Imray:{0}指向的第一个参数.format(){0} {1} {2}只要为赋予相同数量的参数,就可以打印多个值.format()。有关更多示例,请参见docs.python.org/library/string.html#format-examples
Greg Hewgill


60

Python 3.6+(2017年)

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

对于f弦,应使用double {{}}

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

产生所需的

 {Hello} 42

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

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

产生

{hello}

46

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字符串比示例复杂时,最好使用该库。


1
阿们!似乎需要做更多的工作,但是使用库来执行库应该做的事情而不是偷工减料……可以做得更好。
高岭土火

1
但是不能保证Python对象中键的顺序。但是,仍然可以保证JSON库以JSON方式序列化。
wizzwizz4

2
wizzwizz4:好点。从Python 3.6开始,字典按插入顺序排序,因此这不是问题。2.7和3.5之间的Python版本可以使用collections库中的OrderedDict。
twasbrillig '18

24

尝试这样做:

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


14

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

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

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

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


5

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

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的字符串或两个字符串为可迭代的字符串(对于多字符定界符)。


也考虑过这一点。当然,这也将起作用,并且算法更简单。但是,假设您有很多这样的文本,并且只想在此处和此处对其进行参数化。每次创建输入字符串时,您都不想手动替换所有大括号。您只想在这里和那里“插入”您的参数设置。在这种情况下,我认为从用户的角度来看,这种方法既容易思考,又可以完成。我受到linux的'sed'命令的启发,该命令具有类似的功能,可以根据方便的情况任意选择定界符。
tvt173'1

简而言之,我宁愿效用函数比每次使用@ $$都麻烦一点。如果我误解了您的主张,请告诉我。
tvt173'1


3

我最近遇到了这个问题,因为我想将字符串注入预先格式化的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")

如果性能不成问题,则完成工作。


简单而优雅地集成到现有代码中,而无需进行任何修改。谢谢!
Column01

2

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

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

对于使用f弦的用户,请在其两侧使用4个花括号而不是5个
TerryA

0

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

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

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

要么

尝试%s格式化文本,

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

0

我在尝试打印文本时偶然发现了这个问题,可以将其复制粘贴到Latex文档中。我扩展这个答案,并使用命名的替换字段:

假设您要打印出带有诸如的索引的多个变量的乘积 在此处输入图片说明,在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))

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

-1

当您只是想插入代码字符串时,我建议您使用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))

因此,您不会因为其他答案而被迫复制花括号


-3

您可以通过使用原始字符串方法来实现此目的,只需在字符串前添加不带引号的字符'r'。

# to print '{I am inside braces}'
print(r'{I am inside braces}')

你好!您可能需要重新检查;Python 3.7打印\{I am inside braces\}
Teodor

1
@Teodor对此表示抱歉。现在,我通过打印为原始字符串来解决此问题。
严厉的阿格加瓦尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.