Come posso stampare letteralmente caratteri di parentesi graffe in una stringa di pitone e usare anche .format su di essa?


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

mi da : Key Error: Hello\\

Voglio stampare l'output: {Hello} 42



9
Per coloro che vogliono evitare di raddoppiare le parentesi graffe ( {{ }}), utilizzare string.Template. Lì sostituisci gli identificatori del modulo $foo(utile per generare codice LaTeX).
— Ioannis Filippidis,

Per coloro che vogliono evitare di raddoppiare le parentesi graffe e che non sono contrari ad aggiungere un'altra dipendenza ai loro progetti Python, c'è anche Jinja2 che risolve definitivamente questo problema, consentendo la sintassi del delimitatore di segnaposto personalizzata definita dall'utente.
— dreftymac,

Risposte:


2071

Devi raddoppiare {{e e }}:

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

Ecco la parte rilevante della documentazione di Python per la sintassi della stringa di formato :

Le stringhe di formato contengono "campi di sostituzione" circondati da parentesi graffe {}. Tutto ciò che non è contenuto tra parentesi graffe è considerato testo letterale, che viene copiato invariato nell'output. Se è necessario includere un carattere parentesi graffa nel testo letterale, può essere evitato raddoppiando: {{e }}.


264
Quindi se vuoi stampare "{42}", dovresti usare "{{{0}}}".format(42)!
— hughes,

7
Che ne dici se vuoi un singolo tutore riccio? "{ something { } {value}".format(42)non funziona
— AJP

14
"{{" .format () e "}}". format () stampa singole parentesi graffe. Nel tuo esempio: print "{{something {{}} {0}". Format (42) stamperà "{Something {} 42".
— Mark Visser,

2
Cosa {0}significa?
— CodyBugstein,

6
@Imray: si {0}riferisce al primo argomento di .format(). È possibile stampare più di un valore {0} {1} {2}, purché si fornisca lo stesso numero di argomenti .format(). Vedi docs.python.org/library/string.html#format-examples per esempi esaurienti.
— Greg Hewgill,

74

Fuggilo raddoppiando le parentesi graffe.

Per esempio:

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

60

Python 3.6+ (2017)

Nelle recenti versioni di Python si userebbero le stringhe f (vedere anche PEP498 ).

Con le stringhe f si dovrebbe usare double {{o}}

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

produce il desiderato

 {Hello} 42

Se devi risolvere un'espressione tra parentesi invece di usare il testo letterale avrai bisogno di tre serie di parentesi:

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

produce

{hello}

46

L'OP ha scritto questo commento:

Stavo cercando di formattare un piccolo JSON per alcuni scopi, in questo modo: '{"all": false, "selected": "{}"}'.format(data)per ottenere qualcosa del genere{"all": false, "selected": "1,2"}

È abbastanza comune che il problema delle "parentesi graffe" si presenti quando si ha a che fare con JSON.

Suggerisco di fare questo:

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

È più pulito dell'alternativa, che è:

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

L'uso della jsonlibreria è sicuramente preferibile quando la stringa JSON diventa più complicata dell'esempio.


1
Amen! Potrebbe sembrare più lavoro, ma l'uso delle biblioteche per fare ciò che dovrebbero fare le biblioteche rispetto agli spigoli ... rende le cose migliori.
— Fuoco di caolino

1
Ma l'ordine delle chiavi in ​​un oggetto Python non è garantito ... Tuttavia, la libreria JSON è garantita per serializzare in modo JSON.
— wizzwizz4,

2
wizzwizz4: buon punto. Da Python 3.6 in poi, i dizionari sono ordinati per inserzione, quindi non sarebbe un problema. Le versioni di Python tra 2.7 e 3.5 possono usare OrderedDict dalla libreria delle raccolte.
— twasbrillig,

24

Prova a fare questo:

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


14

Anche se non meglio, solo per riferimento, puoi anche fare questo:

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

Può essere utile ad esempio quando qualcuno vuole stampare {argument}. È forse più leggibile di'{{{}}}'.format('argument')

Si noti che si omettono le posizioni degli argomenti (ad es. {}Anziché {0}) dopo Python 2.7


5

Se lo farai molto, potrebbe essere utile definire una funzione di utilità che ti consenta invece di utilizzare sostituti del tutore arbitrario, come

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

Si noti che funzionerà con parentesi che sono una stringa di lunghezza 2 o un iterabile di due stringhe (per i delimitatori a più caratteri).


Ci ho pensato anche. Naturalmente funzionerà anche quello e l'algoritmo è più semplice. Ma immagina di avere un sacco di testo come questo e vuoi solo parametrizzarlo qua e là. Ogni volta che crei una stringa di input non vorrai sostituire manualmente tutte quelle parentesi graffe. Vorresti semplicemente "inserire" le tue parametrizzazioni qua e là. In questo caso, penso che questo metodo sia più facile da pensare e realizzare dal punto di vista dell'utente. Sono stato ispirato dal comando 'sed' di Linux che ha capacità simili per scegliere arbitrariamente il delimitatore in base a ciò che è conveniente.
— tvt173,

In breve, preferirei che la funzione di utilità fosse un po 'più complessa che avere un dolore in @ $$ da usare ogni volta. Per favore fatemi sapere se ho frainteso la vostra proposta.
— tvt173,

Sono andato avanti e ho aggiunto una breve demo al mio spazio public.lab github.com/dreftymac/public.lab/blob/master/topic/python/…
— dreftymac il

3

Di recente mi sono imbattuto in questo, perché volevo iniettare stringhe in JSON preformattato. La mia soluzione era quella di creare un metodo di supporto, come questo:

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

Puoi quindi fare qualcosa del tipo:

formatted = preformat("""
    {
        "foo": "{{bar}}"
    }""").format(bar="gas")

Ottiene il lavoro svolto se le prestazioni non sono un problema.


Semplice ed elegante da integrare nel codice esistente con poche modifiche richieste. Grazie!
— Column01,

2

Se è necessario mantenere due parentesi graffe nella stringa, sono necessarie 5 parentesi graffe su ciascun lato della variabile.

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

Per quelli che usano le stringhe a f, usa 4 parentesi graffe su entrambi i lati anziché 5
— TerryA

0

Il motivo è che {}la sintassi di .format()così nel tuo caso .format()non riconosce {Hello}quindi ha generato un errore.

puoi ignorarlo utilizzando le parentesi graffe doppie {{}},

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

o

prova %sper la formattazione del testo,

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

0

Mi sono imbattuto in questo problema quando ho provato a stampare il testo, che posso copiare e incollare in un documento in lattice. Estendo questa risposta e utilizzo i campi di sostituzione nominati:

Diciamo che vuoi stampare un prodotto di variabili multiple con indici come inserisci qui la descrizione dell'immagine, che in Latex sarebbe $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$ Il seguente codice fa il lavoro con i campi con nome in modo che per molti indici rimanga leggibile:

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

Se si desidera stampare solo una parentesi graffa (ad esempio {), è possibile utilizzare {{e, se lo si desidera, è possibile aggiungere più parentesi successivamente nella stringa. Per esempio:

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

Quando stai solo cercando di interpolare le stringhe di codice, ti suggerisco di usare jinja2, che è un motore di template completo per Python, ovvero:

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

Quindi non sarai costretto a duplicare le parentesi graffe come suggerisce tutto il gruppo di altre risposte


-3

Puoi farlo usando il metodo della stringa grezza semplicemente aggiungendo il carattere 'r' senza virgolette prima della stringa.

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

Ciao! Potresti voler ricontrollarlo; Stampe Python 3.7 \{I am inside braces\}.
— Teodor,

1
@Teodor mi dispiace per quello. Ora ho risolto questo problema stampando come stringa non elaborata.
— Harsh Aggarwal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.