Umkehrung der Python-Zeichenfolgenformatierung: Erzeugen eines Diktats aus einer Zeichenfolge mit benannten Parametern

Ich habe eine Saite wie diese, wo symbol und property variieren:

 a = '/stock/%(symbol)s/%(property)s' 

Ich habe eine andere Saite wie diese, wo AAPL und price variieren:

  • Python Math - TypeError: 'NoneType' Objekt ist nicht abonnierbar
  • Wie kann man die unendliche Rekursion stoppen, wenn Python-Objekte sich gegenseitig auslösen?
  • Ändern Sie Django-Modell Spalte Standard mit Süd
  • Django forms.DateInput übernimmt die im attrs-Feld angegebenen Attribute nicht
  • Verschieben Sie alle Indizes im NumPy-Array
  • Wie kann ich einen Schlüssel aus einem Python-Wörterbuch entfernen?
  •  b = '/stock/AAPL/price' 

    Ich versuche so einen Dict zu generieren:

     c = { 'symbol': 'AAPL', 'property': 'price' } 

    Mit String-Formatierung könnte ich das machen:

     > a % c == b True 

    Aber ich versuche, die andere Richtung zu gehen. Zeit für eine Regex Magie?

  • Senden Sie Schlüssel zu einem inaktiven Fenster in Python
  • Plotten von ODEs, Isoclines mit Python
  • Python WaitForDebugEvent & ContinueDebugEvent (Grey Hat Python)
  • Wie schreibe ich ein setup.py für ein Twistd / Twisted Plugin, das mit setuptools arbeitet, verteilen, etc?
  • Matplotlib: Kreise hinzufügen
  • Wie drucke ich ein ausgerichtetes numpy Array mit (Text-) Zeilen- und Spalten-Labels?
  • 3 Solutions collect form web for “Umkehrung der Python-Zeichenfolgenformatierung: Erzeugen eines Diktats aus einer Zeichenfolge mit benannten Parametern”

    Dies ähnelt der Lösung von @ moliware, aber es gibt keine Hardcodierung von Schlüssel, die in dieser Lösung erforderlich sind:

     import re class mydict(dict): def __missing__(self, key): self.setdefault(key, '') return '' def solve(a, b): dic = mydict() a % dic strs = a for x in dic: esc = re.escape(x) strs = re.sub(r'(%\({}\).)'.format(esc), '(?P<{}>.*)'.format(esc), strs) return re.search(strs, b).groupdict() if __name__ == '__main__': a = '/stock/%(symbol)s/%(property)s' b = '/stock/AAPL/price' print solve(a, b) a = "Foo %(bar)s spam %(eggs)s %(python)s" b = 'Foo BAR spam 10 3.x' print solve(a, b) 

    Ausgabe:

     {'symbol': 'AAPL', 'property': 'price'} {'python': '3.x', 'eggs': '10', 'bar': 'BAR'} 

    Als @torek auf Fälle mit zweideutiger Ausgabe (kein Leerzeichen zwischen den Tasten) hingewiesen hat, kann die Antwort hier falsch sein.

    Zum Beispiel.

     a = 'leading/%(A)s%(B)s/trailing' b = 'leading/helloworld/trailing' 

    Hier betrachten wir nur b es schwer, den tatsächlichen Wert von entweder A oder B zu erzählen.

    Eine Lösung mit regulären Ausdrücken:

     >>> import re >>> b = '/stock/AAPL/price' >>> result = re.match('/.*?/(?P<symbol>.*?)/(?P<property>.*)', b) >>> result.groupdict() {'symbol': 'AAPL', 'property': 'price'} 

    Sie können ein bisschen mehr den regulären Ausdruck anpassen, aber im Grunde ist dies die Idee.

    Unter der Annahme von gut erzogenen Inputs, können Sie einfach die Saiten spalten und zip sie zu einem dict

     keys = ('symbol', 'property') b = '/stock/AAPL/price' dict(zip(keys, b.split('/')[2:4])) 
    Python ist die beste Programmiersprache der Welt.