¿Cómo escapo los caracteres de llaves ({}) en una cadena mientras uso .format (o una cadena f)?

4 minutos de lectura

Avatar de usuario de Schitti
chitti

Ejemplo no funcional:

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

Salida deseada:

 {Hello} 42 

  • Consulte también: stackoverflow.com/questions/35574349

    – drftymac

    6 de diciembre de 2016 a las 5:11

  • Para aquellos que quieren evitar la duplicación de llaves ({{ }}), utilizar string.Template. Ahí se sustituyen identificadores de la forma $foo (útil para generar código LaTeX).

    – 0 _

    11 de enero de 2018 a las 5:51

  • Para aquellos que quieren evitar la duplicación de llaves, y que no son reacios a agregar otra dependencia a sus proyectos de Python, también está Jinja2 que resuelve definitivamente este problema, al permitir la sintaxis de delimitador de marcador de posición personalizada definida por el usuario.

    – drftymac

    15 de enero de 2020 a las 20:07


Avatar de usuario de Greg Hewgill
greg hewgill

Necesitas duplicar el {{ y }}:

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

Aquí está la parte relevante de la Documentación de Python para la sintaxis de cadena de formato:

Las cadenas de formato contienen “campos de reemplazo” rodeados de llaves {}. Cualquier cosa que no esté entre llaves se considera texto literal, que se copia sin cambios en la salida. Si necesita incluir un carácter de llave en el texto literal, se puede evitar duplicando: {{ y }}.

  • Entonces, si desea imprimir “{42}”, usaría "{{{0}}}".format(42) !

    – abrazos

    24 de julio de 2013 a las 20:21

  • ¿Qué pasa si quieres una sola llave? "{ something { } {value}".format(42) no funciona

    – AJP

    2 oct 2013 a las 10:10


  • “{{“.format() y “}}”.format() imprimen llaves simples. En tu ejemplo: imprime “{{ algo {{ }} {0}”. format(42) imprimirá “{ algo { } 42”.

    –Mark Visser

    18/10/2013 a las 21:19

  • Lo que hace el {0} ¿significar?

    – Cody Bugstein

    21 de febrero de 2014 a las 1:27

  • @Imray: {0} se refiere al primer argumento de .format(). Puede imprimir más de un valor como {0} {1} {2} siempre y cuando le des el mismo número de argumentos a .format(). Ver docs.python.org/library/string.html#format-examples para ejemplos extensos.

    – Greg Hewgill

    21 de febrero de 2014 a las 1:30

avatar de usuario de divenex
Divenex

Pitón 3.6+ (2017)

En las versiones recientes de Python se usaría cuerdas f (ver también PEP498).

Con f-strings uno debe usar doble {{ o }}

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

produce lo deseado

 {Hello} 42

Si necesita resolver una expresión entre corchetes en lugar de usar texto literal, necesitará tres conjuntos de corchetes:

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

produce

{hello}

  • De my_greet = "HELLO" puedes obtener {hello} como salida, usando solo 2 juegos de corchetes, con print(f"{ {my_greet.lower()} }"). Solo deja un espacio entre paréntesis.

    – año

    20 de julio de 2020 a las 7:07


  • Esta debería ser ahora la respuesta aceptada si está utilizando Python3.6+ en los tiempos de la rona.

    – Gwi7d31

    20 de noviembre de 2020 a las 18:27

  • @ Gwi7d31 No, las cuerdas f no son un reemplazo para str.format(). Por ejemplo, esta respuesta que escribí no es posible con f-strings ya que la plantilla proviene de la entrada, no del código fuente.

    – wjandrea

    20 mayo 2021 a las 18:20

  • @wjandrea su enlace realmente no pertenece a la pregunta de OP. El OP quiere mantener las llaves mientras las elimina en su respuesta vinculada a través de .format() y el método de desempaquetado de su diccionario. Si desea conservar {} en Python 3.6+ y desea insertar un valor en una cadena, this is the way. Esa es la pregunta en cuestión. Tampoco dije que f-strings son un reemplazo para .format(). Tú dijiste eso.

    – Gwi7d31

    26 de mayo de 2021 a las 3:06

  • @Gwi Lo que digo es que esta pregunta es sobre str.format()no f-strings, y no son compatibles entre sí.

    – wjandrea

    26 de mayo de 2021 a las 3:18

Avatar de usuario de Kamil Kisiel
kamil kisiel

Lo escapas doblando las llaves.

P.ej:

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

avatar de usuario de twasbrillig
twasbrillig

El OP escribió este comentario:

Estaba tratando de formatear un JSON pequeño para algunos propósitos, como este: '{"all": false, "selected": "{}"}'.format(data) para obtener algo como {"all": false, "selected": "1,2"}

Es bastante común que surja el problema de las “llaves de escape” cuando se trata de JSON.

Sugiero hacer esto:

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

Es más limpio que la alternativa, que es:

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

Utilizando el json La biblioteca es definitivamente preferible cuando la cadena JSON se vuelve más complicada que el ejemplo.

Avatar de usuario de Nicoolasens
Nicoolasen

Desea formatear una cadena con el carácter { o }

Solo tienes que duplicarlos.

formato { con f'{{' y }con f'}}'

Entonces :

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

Producción :

Hola Bob ! Quiero imprimir } y { o { }

O para el ejemplo exacto:

number = 42
print(f'{{Hello}} {number}')

Imprimirá:

{Hola} 42

avatar de usuario de pajton
pajtón

Prueba esto:

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

Avatar de usuario de DNR
DNR

Intenta hacer esto:

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

¿Ha sido útil esta solución?