使用 .format 时,如何转义字符串中的花括号({})字符?
- 2024-11-19 08:38:00
- admin 原创
- 9
问题描述:
非工作示例:
print(" { Hello } {0} ".format(42))
期望输出:
{Hello} 42
解决方案 1:
您需要将{{
和加倍}}
:
>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '
以下是Python 文档中有关格式字符串语法的相关部分:
格式字符串包含用大括号括起来的“替换字段”
{}
。任何未包含在大括号中的内容都被视为文字文本,这些文本将原封不动地复制到输出中。如果您需要在文字文本中包含大括号字符,可以通过重复使用 :{{
和 来转义}}
。
解决方案 2:
Python 3.6+(2017)
在最近版本的 Python 中,人们会使用f 字符串(另请参阅PEP498)。
对于 f 字符串,应该使用 double{{
或}}
n = 42
print(f" {{Hello}} {n} ")
产生所需的
{Hello} 42
如果您需要解决括号中的表达式而不是使用文字文本,那么您将需要三组括号:
hello = "HELLO"
print(f"{{{hello.lower()}}}")
生产
{hello}
解决方案 3:
您可以通过加倍括号来摆脱它。
例如:
x = "{{ Hello }} {0}"
print(x.format(42))
解决方案 4:
您想要使用字符{
或格式化字符串}
你只需将它们加倍即可。
格式{
与f'{{'
和}
与f'}}'
所以 :
name = "bob"
print(f'Hello {name} ! I want to print }} and {{ or {{ }}')
输出 :
你好,鲍勃!我想打印 } 和 { 或 { }
或者确切的例子:
number = 42
print(f'{{Hello}} {number}')
将打印:
{你好} 42
最后 :
number = 42
string = "bob"
print(f'{{Hello}} {{{number}}} {number} {{{string}}} {string} ')
{你好} {42} 42 {bob} bob
解决方案 5:
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 字符串比示例更复杂时,使用该库绝对是更好的选择。
解决方案 6:
尝试一下:
x = "{{ Hello }} {0}"
解决方案 7:
尝试这样做:
x = " {{ Hello }} {0} "
print x.format(42)
解决方案 8:
虽然没有什么更好,仅供参考,你也可以这样做:
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
例如,当有人想打印时,它可能很有用{argument}
。它可能比'{{{}}}'.format('argument')
请注意,在 Python 2.7 之后,省略参数位置(例如,{}
而不是){0}
解决方案 9:
key = "FOOBAR"
print(f"hello {{{key}}}")
输出
hello {FOOBAR}
如果有人想使用 fstrings 在花括号内打印某些内容。
解决方案 10:
f 字符串 (python 3)
您可以通过仅对要应用 f-magic 的字符串部分使用 f 字符串来避免必须使用双花括号,并对所有文字部分(可能包含“不安全”特殊字符)使用常规(愚蠢)字符串。只需将多个字符串堆叠在一起,python 即可为您完成字符串连接。
number = 42
print("{The answer is} "
f"{number}"
" {thanks for all the fish}")
### OUTPUT:
{The answer is} 42 {thanks for all the fish}
注意:字符串之间的换行符是可选的。我只是为了方便阅读才添加的。您也可以按如下所示编写上述代码:
⚠️警告:这可能会伤害您的眼睛或让您感到头晕!
print("{The answer is} "f"{number}"" {thanks for all the fish}")
解决方案 11:
如果需要在字符串中保留两个花括号,则变量两侧各需要 5 个花括号。
>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'
解决方案 12:
如果你要经常这样做,最好定义一个实用函数,让你使用任意括号替代,例如
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 的字符串或两个字符串的可迭代对象(对于多字符分隔符)。
解决方案 13:
我最近遇到了这个问题,因为我想将字符串注入预格式化的 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")
如果性能不是问题的话,就可以完成工作。
解决方案 14:
原因是,您的情况下{}
的语法无法识别,所以引发了错误。.format()
`.format()`{Hello}
您可以使用双花括号 {{}} 来覆盖它,
x = " {{ Hello }} {0} "
或者
尝试%s
文本格式化,
x = " { Hello } %s"
print x%(42)
解决方案 15:
我参加这个聚会太晚了。我成功地将括号放在替换元素中,如下所示:
print('{0} {1}'.format('{hello}', '{world}'))
打印
{hello} {world}
严格来说,这不是 OP 所要求的,因为他/她想要格式字符串中的括号,但这可能会对某些人有所帮助。
解决方案 16:
这是另一个解决方案。为什么它很棒:
允许您保留原来的单个花括号。
如果未找到变量,则不会出现异常。
这只是一个简单的功能:
def format_string_safe(text:str, **kwargs):
if text is None:
return ''
result = text
try:
for k in kwargs:
result = result.replace(f'{{{k}}}', str(kwargs[k]))
return result
except Exception as ex:
print_traceback(ex)
return text
使用方法:
format_string_safe('THis is my text with some {vars}.', vars=22)
解决方案 17:
我使用了双 {{ }} 来防止 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 语句
解决方案 18:
我在尝试打印文本时偶然发现了这个问题,我可以将其复制粘贴到 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))
解决方案 19:
您可以使用“引号墙”将格式化的字符串部分与常规字符串部分分开。
从:
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}
解决方案 20:
如果只想打印花括号的一侧:
a=3
print(f'{"{"}{a}')
>>> {3
解决方案 21:
如果您只想打印一个花括号(例如),则{
可以使用{{
,并且您可以在字符串的后面根据需要添加更多括号。例如:
>>> 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'
解决方案 22:
当您只是尝试插入代码字符串时,我建议使用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))
因此,您不必像其他答案所建议的那样重复使用花括号
解决方案 23:
如果需要在可格式化的 f 字符串模板中使用花括号,则需要在 f 字符串的一组花括号内输出一个包含两个花括号的字符串:
css_template = f"{{tag}} {'{{'} margin: 0; padding: 0;{'}}'}"
for_p = css_template.format(tag="p")
# 'p { margin: 0; padding: 0;}'
解决方案 24:
或者只是参数化括号本身?可能非常冗长。
x = '{open_bracket}42{close_bracket}'.format(open_bracket='{', close_bracket='}')
print(x)
# {42}
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件