[Python 2/3] Analysiert die Formatzeichenfolge

Derzeit gibt es in Python drei Arten von Funktionen, die dem Sprintf von C entsprechen. (F-String wird ausgeschlossen, da kein Format-String verwendet wird)

Name? Wie benutzt man
%-formatting fmt % values
str.format() fmt.format(*values) / fmt.format(**values)
Template strings string.Template(fmt).substitute(**values)

In diesem Artikel wird zusammengefasst, wie Sie herausfinden können, wie viele Tapple-Elemente im Abschnitt "values" der obigen Tabelle oder in den Schlüsseln im Wörterbuch erforderlich sind. Um ehrlich zu sein, denke ich, dass es ein ziemlich selten verwendetes Wissen ist, aber es kann nützlich sein, wenn Sie Ihren eigenen Formatierer erstellen, indem Sie "logging.Formatter" erben.

Überblick

--% -Formatierung → Fehlerformat und Ausnahme anzeigen.

%-formatting (printf style formatting) Im Gegensatz zu den beiden anderen kann ich im Standardpaket keine dedizierte Funktion zum Parsen finden, daher werde ich mein Bestes geben. Dieses Mal habe ich eine Funktion zum Entschlüsseln basierend auf der zurückgeworfenen Ausnahme erstellt. Wenn der im values-Teil von fmt% values angeforderte Typ ein Taple ist, wird seine Länge zurückgegeben, und wenn es sich um ein Wörterbuch handelt, wird sein Schlüssel zurückgegeben.

def parse_printf_style_format(fmt):
    if not isinstance(fmt, (bytes, str)):
        raise TypeError('got ' + type(fmt).__name__)
        
    try:
        fmt % ()
    except TypeError as e:
        if e.args[0] == 'not enough arguments for format string':
            values = ()
        elif e.args[0] == 'format requires a mapping':
            values = {}
        else:
            raise
    else:
        return None
    
    if isinstance(values, tuple):
        while True:
            try:
                fmt % values
            except TypeError as e:
                if e.args[0] == 'not enough arguments for format string':
                    values += (0,)
                else:
                    raise ValueError('invalid format: ' + repr(fmt))
            else:
                return len(values)
    elif isinstance(values, dict):
        while True:
            try:
                fmt % values
            except TypeError as e:
                if e.args[0] == 'not enough arguments for format string':
                    raise ValueError('invalid format: ' + repr(fmt))
                else:
                    raise
            except KeyError as e:
                values[e.args[0]] = 0
            else:
                return tuple(values.keys())
    else:
        assert False

Anwendungsbeispiel

>>> parse_printf_style_format('%d %s %x')
3
>>> parse_printf_style_format('%(foo)s, %(bar)d')
('foo', 'bar')

str.format()

Es ist ein Schlag mit string.Formatter (). Parse (fmt). Weitere Informationen finden Sie unter Offizielles Dokument.

>>> import string
>>> fmt = '{foo:s}, {{bar:d}}, and {:f}'
>>> list(string.Formatter().parse(fmt))
[('', 'foo', 's', None),
 (', {', None, None, None),
 ('bar:d}', None, None, None),
 (', and ', '', 'f', None)]

Template strings

Es ist ein Schlag mit "string.Template.pattern.finditer (fmt)". Der reguläre Ausdruck, der dem Platzhalter entspricht, wird im Attribut pattern gespeichert.

>>> import string
>>> fmt = '${this_is_braced} $$this_is_escaped $@this_is_invalid $this_is_named'
>>> print(string.Template.pattern.pattern)
    \$(?:
      (?P<escaped>\$) |   # Escape sequence of two delimiters
      (?P<named>[_a-z][_a-z0-9]*)      |   # delimiter and a Python identifier
      {(?P<braced>[_a-z][_a-z0-9]*)}   |   # delimiter and a braced identifier
      (?P<invalid>)              # Other ill-formed delimiter exprs
    )
>>> [match.groupdict() for match in string.Template.pattern.finditer(fmt)]
[{'braced': 'this_is_braced', 'escaped': None, 'invalid': None, 'named': None},
 {'braced': None, 'escaped': '$', 'invalid': None, 'named': None},
 {'braced': None, 'escaped': None, 'invalid': '', 'named': None},
 {'braced': None, 'escaped': None, 'invalid': None, 'named': 'this_is_named'}]

Impressionen

Die Kältebehandlung der% -Formatierung ist schrecklich.

Recommended Posts

[Python 2/3] Analysiert die Formatzeichenfolge
Python-String-Format
Python-String-Format
Python-Einzug und String-Format
String-Format mit Python% -Operator
String-Format
Zeichenfolgenformat 2
Python-String
[Python3] Formatieren Sie die Zeichenfolge mit dem Variablennamen als Schlüssel
Python: Strings kombinieren
Python String Slice
Python: Verwenden Sie die im Zeichenfolgenformat definierten Variablen unverändert
Wellenförmige Klammern in der Formatzeichenfolge maskieren
Python2-Zeichenfolgentyp
Python # String-Typ
Format in Python
Python-String-Inversion
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Lassen Sie uns das Git-Commit-Protokoll in Python analysieren!
[Python] matplotlib: Formatieren Sie das Diagramm für Ihre Dissertation
[Python] So ändern Sie das Datumsformat (Anzeigeformat)
json.dumping Keine in Python gibt die Zeichenfolge null zurück
String zum Unicode-Escape-Sequenzformat für Python
Finden Sie das maximale Python
String-Manipulation in Python
Analysieren Sie XML in Python
[Python] Mehrzeilige Zeichenfolgenzuweisung
Python-String-Manipulations-Master
der Zen von Python
python> datetime> Formatzeichenfolge datetime abrufen (z. B. 20151130)> print today.strftime ("% Y% m% d") / print "{:% Y% m% d}" .format ( heute)
Bildformat in Python
[Python2] Datumszeichenfolge → UnixTime → Datumszeichenfolge
Notizen im Python Pickle-Format
Methodische Verwendung im [Python] -Format
Zufällige String-Generierung (Python)
Für Format analysieren, für Jinja2 ...?
[Python] Teilen Sie das Datum
Python3> Dokumentationszeichenfolge / Dokumentzeichenfolge
Abbildung zur Verarbeitung von Python-Zeichenfolgen
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
Analysieren Sie eine JSON-Zeichenfolge, die in eine Datei in Python geschrieben wurde
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
Python> Datum / Uhrzeit> Von der Datumszeichenfolge (ISO-Format: 2015-12-09 12:40:08) zum Datum / Uhrzeit-Typ
Ich habe versucht, die String-Operationen von Python zusammenzufassen
python3 Messen Sie die Verarbeitungsgeschwindigkeit.
[Python] Datum in Zeichenfolge konvertieren
Einfaches Formatieren von JSON mit Python
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Auf dem Weg zum Ruhestand von Python2
Entfernen Sie Leerzeichen in voller Breite vor und nach der Zeichenfolge (Python).
String-Objektmethoden in Python
Finde Fehler in Python
[Python] Verwenden Sie eine Zeichenfolgenfolge
Vergleichen wir die Python-Array-ähnlichen Typen
Über das Python-Modul venv
Holen Sie sich den MIME-Typ in Python und bestimmen Sie das Dateiformat
Über die Aufzählungsfunktion (Python)
[Python] Anpassen der Farbleiste
[Python] Holen Sie sich den Vormonat