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:

 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?

  • Erstellen eines benutzerdefinierten kategorisierten Korpus in NLTK und Python
  • Match irgendwie EXCEPT eine Folge von Perioden oder Ellipsen
  • Bestimmen des unübertroffenen Teils eines Strings unter Verwendung eines Regex in Python
  • Reguläre Ausdrücke und Zeichencodes in Scrapy-Exportdaten
  • Ändern ** Bediener zur Leistungsfunktion mit Parsing?
  • Python RE (In einem Wort, um den ersten Buchstaben zu überprüfen, ist Groß- und Kleinschreibung unter Berücksichtigung aller Groß- und Kleinschreibung)
  • Python Regular Expression findall mit Variable
  • Recking regex (python)
  • 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.