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:

  • Pythonreferenzen
  • Anhängen macht meine Liste zu NoneType
  • POST-Anfrage funktioniert im Briefträger aber nicht in Python
  • Mock Y von (von X import Y) in doctest (python)
  • PySide: QMetaObject.connectSlotsByName gibt Warnungen aus "Kein passendes Signal ..." aber funktioniert immer noch ..?
  • Holen Sie sich ImportError: Kein Modul namens Control, wenn Sie Google Cloud Endpoint Tutorial folgen
  •  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?

  • TypeError: 'RelatedManager' Objekt ist nicht iterable
  • Kann ein Objekt den Namen der Variablen inspizieren, auf die es zugewiesen wurde?
  • Python Selen - Element ist derzeit nicht interoperabel und darf nicht manipuliert werden
  • Kann ich Teile des Google App Engine-Codes in Java schreiben, andere Teile in Python?
  • Einheitsprüfung von Tastendrücken und Klemmenausgang in Python?
  • Python3 Integer Division
  • 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.