web-dev-qa-db-ger.com

Wie kann ich wörtliche geschweifte Klammern in der Zeichenfolge python drucken und auch .format verwenden?

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

gibt mir: Key Error: Hello\\

Ich möchte die Ausgabe drucken: {Hello} 42

1244
Schitti

Sie müssen den {{ und den }} verdoppeln:

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

Hier ist der relevante Teil der Python-Dokumentation für die Format-String-Syntax :

Formatstrings enthalten "Ersetzungsfelder", die von geschweiften Klammern {} umgeben sind. Alles, was nicht in geschweiften Klammern steht, wird als wörtlicher Text betrachtet, der unverändert in die Ausgabe kopiert wird. Wenn Sie ein Klammerzeichen in den Literaltext einfügen müssen, können Sie es durch Verdoppeln von: {{ und }} maskieren.

1710
Greg Hewgill

Sie können dem entkommen, indem Sie die Zahnspange verdoppeln.

Z.B:

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

Das OP schrieb diesen Kommentar:

Ich habe versucht, einen kleinen JSON-Code für einige Zwecke zu formatieren: '{"all": false, "selected": "{}"}'.format(data), um so etwas wie {"all": false, "selected": "1,2"} zu erhalten.

Es kommt ziemlich häufig vor, dass beim Umgang mit JSON das Problem "Escape-Klammern" auftritt.

Ich schlage vor, dies zu tun:

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

Es ist sauberer als die Alternative:

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

Die Verwendung der Bibliothek json ist auf jeden Fall vorzuziehen, wenn der JSON-String komplizierter als das Beispiel wird.

35
twasbrillig

Python 3.6+ (2017)

In den neueren Versionen von Python würde man f-Strings verwenden (siehe auch PEP498 ).

Bei f-Strings sollte man double {{ oder }} verwenden

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

produziert das gewünschte

 {Hello} 42

Wenn Sie einen Ausdruck in Klammern auflösen müssen, anstatt Literaltext zu verwenden, benötigen Sie drei Sätze von Klammern:

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

produziert

{hello}
27
divenex

Versuchen Sie Folgendes:

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

Versuche dies:

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

23
pajton

Obwohl es nicht besser ist, nur als Referenz, können Sie dies auch tun:

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

Dies kann beispielsweise nützlich sein, wenn jemand {argument} drucken möchte. Es ist möglicherweise lesbarer als '{{{}}}'.format('argument')

Beachten Sie, dass Sie Argumentpositionen (z. B. {} anstelle von {0}) nach Python 2.7 weglassen

15
George Aprilis

Wenn Sie dies häufig tun, ist es möglicherweise sinnvoll, eine Utility-Funktion zu definieren, mit der Sie stattdessen beliebige Klammerersatzzeichen verwenden können, z

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

Beachten Sie, dass dies entweder mit Klammern funktioniert, die eine Zeichenfolge der Länge 2 oder eine Iteration von zwei Zeichenfolgen sind (für Trennzeichen mit mehreren Zeichen).

6
tvt173

Der Grund ist, dass {} die Syntax von .format() ist, also erkennt .format() in Ihrem Fall {Hello} nicht und warf einen Fehler aus.

sie können es überschreiben, indem Sie doppelte geschweifte Klammern {{}} verwenden.

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

oder

versuchen Sie %s für die Textformatierung,

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

Wenn Sie zwei geschweifte Klammern in der Zeichenfolge behalten müssen, benötigen Sie 5 geschweifte Klammern auf jeder Seite der Variablen.

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

Sie können String.Template() verwenden:

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