Frage Wie kann ich literale geschweifte Klammernzeichen in Pythonzeichenfolge drucken und auch .format darauf verwenden?


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

gibt mir : Key Error: Hello\\

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


930
2018-03-29 00:04


Ursprung


Antworten:


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

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

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

Formatzeichenfolgen enthalten "Ersatzfelder", die von geschweiften Klammern umgeben sind {}. Alles, was nicht in geschweiften Klammern enthalten ist, wird als literaler Text betrachtet, der unverändert in die Ausgabe kopiert wird. Wenn Sie ein geschweiftes Zeichen in den Literaltext einfügen müssen, kann es durch Verdoppeln umgangen werden: {{ und }}.


1267
2018-03-29 00:08



Du entkommst ihm, indem du die Zahnspange verdoppelst.

Z.B:

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

52
2018-03-29 00:08



Versuchen Sie Folgendes:

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

24
2018-03-29 00:08



Versuche dies:

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


20
2018-03-29 00:08



Das OP schrieb diesen Kommentar:

I was trying to format a small JSON for some purposes, like this: '{"all": false, "selected": "{}"}'.format(data) to get something like {"all": false, "selected": "1,2"}

Es ist ziemlich üblich, dass das Problem "Escape-Klammern" beim Umgang mit JSON 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, die ist:

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

Verwendung der json Bibliothek ist definitiv vorzuziehen, wenn die JSON-Zeichenfolge komplizierter als das Beispiel wird.


19
2018-06-06 18:59



Obwohl nicht besser, nur für die Referenz, können Sie dies auch tun:

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

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

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


9
2017-11-05 11:22



Python 3.6 (2017)

In der aktuellen Version von Python würde man verwenden f-Saiten (siehe auch PEP498).

Auch bei f-Strings sollte man double verwenden {{ oder }}

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

produziert das gewünschte

 {Hello} 42

7
2017-12-21 11:12



Wenn Sie das sehr oft machen, ist es vielleicht hilfreich, eine Utility-Funktion zu definieren, mit der Sie stattdessen beliebige Klammerersatz verwenden können

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 funktioniert, wenn Klammern eine Zeichenfolge der Länge 2 oder eine iterierbare Zeichenfolge aus zwei Zeichenfolgen sind (für mehrzeilige Trennzeichen).


4
2017-11-29 23:43



Grund ist, {} ist die Syntax von .format() also in deinem Fall .format() erkennt nicht {Hello} also hat es einen Fehler ausgelöst.

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

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

oder

Versuchen %s für die Textformatierung,

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

1
2018-06-27 12:40