web-dev-qa-db-fra.com

Comment puis-je imprimer des caractères d'accolades bouclés littéraux dans la chaîne python et utiliser également .format dessus?

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

me donne: Key Error: Hello\\

Je veux imprimer le résultat: {Hello} 42

1244
Schitti

Vous devez doubler les {{ et }}:

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

Voici la partie pertinente de la documentation Python pour la syntaxe de chaîne de formatage :

Les chaînes de format contiennent des "champs de remplacement" entourés d'accolades {}. Tout ce qui n'est pas entre accolades est considéré comme du texte littéral, qui est copié tel quel dans la sortie. Si vous devez inclure une accolade dans le texte littéral, vous pouvez l'échapper en doublant: {{ et }}.

1710
Greg Hewgill

Vous y échappez en doublant les bretelles.

Par exemple:

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

L'OP a écrit ce commentaire:

J'essayais de formater un petit JSON à certaines fins, comme ceci: '{"all": false, "selected": "{}"}'.format(data) pour obtenir quelque chose comme {"all": false, "selected": "1,2"}

Il est assez courant que le problème des "accouplements d'échappement" se pose lorsqu'il est question de JSON.

Je suggère de faire ceci:

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

C'est plus propre que l'alternative, qui est:

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

L'utilisation de la bibliothèque json est définitivement préférable lorsque la chaîne JSON devient plus compliquée que l'exemple.

35
twasbrillig

Python 3.6+ (2017)

Dans les versions récentes de Python, on utiliserait chaînes f (voir aussi PEP498 ).

Avec les f-strings, on devrait utiliser double {{ ou }}

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

produit le désiré

 {Hello} 42

Si vous devez résoudre une expression entre crochets au lieu d'utiliser du texte littéral, vous aurez besoin de trois jeux de crochets:

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

produit

{hello}
27
divenex

Essayez de faire ceci:

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

Essaye ça:

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

23
pajton

Bien que ce ne soit pas mieux, juste pour la référence, vous pouvez aussi le faire:

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

Cela peut être utile par exemple lorsque quelqu'un veut imprimer {argument}. C'est peut-être plus lisible que '{{{}}}'.format('argument')

Notez que vous omettez les positions d’argument (par exemple, {} au lieu de {0}) après Python 2.7.

15
George Aprilis

Si vous faites cela souvent, il peut être utile de définir une fonction utilitaire qui vous permettra d'utiliser des substituts d'accolades arbitraires, comme

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

Notez que cela fonctionnera avec des crochets étant une chaîne de longueur 2 ou un itérable de deux chaînes (pour les délimiteurs multi-caractères).

6
tvt173

La raison en est que {} correspond à la syntaxe de .format(). Dans votre cas, .format() ne reconnaît donc pas {Hello} et a donc généré une erreur.

vous pouvez le remplacer en utilisant des doubles accolades {{}},

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

ou

essayez %s pour la mise en forme du texte,

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

Si vous devez conserver deux accolades dans la chaîne, vous avez besoin de 5 accolades de chaque côté de la variable.

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

Vous pouvez utiliser String.Template() :

from string import Template
s = Template('$txt, $num')
s.substitute(txt='{Hello}', num='42 ')
0
Alec Alameddine