2016-10-01 23 views
1

ich einen String mit gültigem Python-Wörterbuch habe innerhalbExtract Python-Wörterbuch aus string

data = "Some string created {'Foo': u'1002803', 'Bar': 'value'} string continue etc." 

Ich brauche diesen dict zu extrahieren. Ich habe versucht mit Regex aber aus irgendeinem Grund re.search(r"\{(.*?)\}", data) hat nicht funktioniert. Gibt es einen besseren Weg, dieses Diktat zu extrahieren?

+1

Wo bekommen Sie die Zeichenfolge aus? Warum sieht es so aus? Könnten Sie es in einem nützlicheren Format bekommen? – jonrsharpe

+0

@jonrsharpe Warum ist das wichtig für die Frage, wie es ist, so ist die Frage ziemlich klar. – Goran

+0

Unterstreichen Sie das Wörterbuch und verwenden Sie 'ast.literal_eval (substr)', um es in ein Wörterbuch umzuwandeln. – AChampion

Antwort

1

Von @ AChampions Vorschlag.

>>> import re 
>>> import ast 
>>> x = ast.literal_eval(re.search('({.+})', data).group(0)) 
>>> x 
{'Bar': 'value', 'Foo': '1002803'} 

so das Muster für Sie suchen ist re.search('({.+})', data)

Sie sollten die geschweiften Klammern mit der Zeichenfolge extrahieren, so ast.literal_eval die Zeichenfolge in einem Python-Wörterbuch umwandeln kann. Sie brauchen auch nicht das r Präfix als { oder } in einer einfangenden Gruppe, würde () buchstäblich übereinstimmen.

+0

Beachten Sie, dass, da die Regex gierig ist, dies immer noch in dem Fall funktioniert, wenn es ein verschachteltes "Diktat" gibt, z. '" Einige Strings wurden erstellt {'Foo': u'1002803 ',' Bar ':' Wert ',' Baz ': {1: 2, 3: 4}} string weiter usw. "'. Es schlägt jedoch fehl, wenn mehr als ein separates 'dict' in der Zeichenfolge vorhanden ist. Z. B. "Einige Strings haben {'Foo': u'1002803 ',' Bar ':' value '} Strings usw. erzeugt. Ein anderes Diktat: {1: 2, 3: 4}" '. Ein ** Parser ** ist notwendig, um den letzteren Fall zu behandeln (oder wenn '{' oder '}' irgendwo anders in der Zeichenkette vorkommen könnte). – jpmc26

+0

@ jpmc26 macht es nicht gierig ('re.findall (r '{. +?}', Data)') sollte zusätzliche Vorkommen von '{}' behandeln. aber das würde die verschachtelten Wörterbücher durcheinander bringen, da sie als unterschiedliche Ereignisse betrachtet würden, wenn sie tatsächlich Teil einer größeren Gruppe sind. Also wird ein Parser benötigt, um beide Fälle gleichzeitig zu behandeln. – danidee

+0

Übrigens woher wussten Sie, dass ich diese Antwort bearbeitet habe (ich war nur vorbei und repariere einige Tippfehler in meinen alten Antworten :)) – danidee

-1

Ihre Lösung funktioniert!

In [1]: import re 

In [2]: data = "Some string created {'Foo': u'1002803', 'Bar': 'value'} string continue etc." 

In [3]: a = eval(re.search(r"\{(.*?)\}", data).group(0)) 

In [4]: a 
Out[4]: {'Bar': 'value', 'Foo': u'1002803'} 
+0

Unnötige Verwendung von 'eval'. -1 – jpmc26