我如何打印一个字符串中的花括号字符,同时使用。

非工作示例:

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

期望输出:

 {Hello} 42
842952 次浏览

试试这个:

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

你通过加倍括号来逃避它。

例如:

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

尝试这样做:

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

您需要将\{\{}}翻倍:

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

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

格式字符串包含由大括号{}包围的“替换字段”。大括号中不包含的任何内容都被视为文字文本,它将原封不动地复制到输出中。如果您需要在文字文本中包含大括号字符,可以通过加倍来转义:\{\{}}

虽然没有更好,但仅供参考,您也可以这样做:

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

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

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

OP写了这个评论:

我试图为某些目的格式化一个小JSON,如下所示:'{"all": false, "selected": "{}"}'.format(data)以获得类似{"all": false, "selected": "1,2"}的内容

在处理JSON时,“转义大括号”问题很常见。

我建议这样做:

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

它比替代方案更干净,即:

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

当JSON字符串比示例更复杂时,使用json库肯定更可取。

如果您要经常这样做,那么定义一个实用函数可能会很好,它可以让您使用任意大括号替代品,例如

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)

Python 3.6+(2017)

在最近的Python版本中,人们会使用f字串(另见PEP498)。

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

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

产生所需

 {Hello} 42

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

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

产生

{hello}

如果你需要在字符串中保留两个花括号,你需要在变量的每一边都有5个花括号。

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

我在尝试打印文本时偶然发现了这个问题,我可以将其复制粘贴到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))

我最近遇到了这个问题,因为我想将字符串注入预格式化的JSON。我的解决方案是创建一个辅助方法,如下所示:

def preformat(msg):""" allow \{\{key}} to be used for formatting in textthat already uses curly braces.  First switch this intosomething else, replace curlies with double curlies, and thenswitch 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")

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

如果您想只有打印一个花括号(例如{),您可以使用\{\{,如果需要,您可以稍后在字符串中添加更多花括号。例如:

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

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

所以你不会被强制复制花括号,就像其他答案所暗示的那样

我在这个聚会上迟到了。我成功地将括号放在替换元素中,像这样:

print('{0} {1}'.format('{hello}', '{world}'))

其中打印

{hello} {world}

严格来说,这不是OP所要求的,因为s/he想要格式字符串中的大括号,但这可能会对某人有所帮助。

您可以使用“引号墙”将格式化的字符串部分与常规字符串部分分开。

发件人:

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

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

一个更清晰的例子是

string = 10print(f"{string} {word}")

输出:

NameError: name 'word' is not defined

现在,像这样添加报价墙:

string = 10print(f"{string}"" {word}")

输出:

10 {word}

如果您需要在可以格式化的f-string模板中使用花括号,则需要在f-string的一组花括号中输出一个包含两个花括号的字符串:

css_template = f"\{\{tag}} {'\{\{'} margin: 0; padding: 0;{'}}'}"for_p = css_template.format(tag="p")# 'p { margin: 0; padding: 0;}'

或者只是参数化括号本身?可能非常冗长。

x = '{open_bracket}42{close_bracket}'.format(open_bracket='{', close_bracket='}')print(x)# {42}

我使用了 \{\{ }} 来防止fstring值注入,

例如,我的Postgres UPDATE语句用于更新一个整数数组列,该数组列采用{}的表达式来捕获数组,即:

port='{100,200,300}'

用fstring它,

ports = [1,2,3]
query = f"""UPDATE table SET ports = '\{\{{ports}}}' WHERE id = 1"""

实际的查询语句将是,

UPDATE table SET ports = '{1,2,3}'

这是一个有效的职位要求

f字符串(python 3)

您可以避免通过对字符串中您希望应用f-魔法的部分使用f-字符串只有来将花括号加倍,并对所有文字和可能包含“不安全”特殊字符的内容使用常规(哑)字符串。

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

注意:字符串之间的换行符不是必需的。我添加它们只是为了易读性。您也可以编写上面的代码,如下所示:

⚠️警告:这可能会伤害你的眼睛或让你头晕!

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

如果您只想打印花括号的一侧:

a=3print(f'{"{"}{a}')>>> {3

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

你只需要加倍。

格式{f'\{\{'}f'}}'

所以:

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

输出:

你好鲍勃!我想打印}和{或{}

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

产出

hello {FOOBAR}

如果有人想使用fstring在花括号内打印一些东西。