使用 .format 时,如何转义字符串中的花括号({})字符?

2024-11-19 08:38:00
admin
原创
10
摘要:问题描述:非工作示例:print(" { Hello } {0} ".format(42)) 期望输出: {Hello} 42 解决方案 1:您需要将{{和加倍}}:>>> x = " {{ Hello }} {0} " >>> p...

问题描述:

非工作示例:

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:

这是另一个解决方案。为什么它很棒:

  1. 允许您保留原来的单个花括号。

  2. 如果未找到变量,则不会出现异常。

这只是一个简单的功能:

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}
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用