2016-05-26 6 views
0

Ich habe eine Zeichenfolge mit den Werten in der Form Schlüssel = Wert, durch Leerzeichen getrennt, das heißtfindet findall von Regex ungeordnete Elemente im Python-Wörterbuch?

my_string = "a=1 b=10 z=234 h=5" 

, was ich brauche ist eine Regex zu verwenden und jenen Wert in einem Wörterbuch speichern; so weit ich habe dies getan:

my_dict = dict(re.findall(r'(\S+)=(".*?"|\S+)', my_string)) 
print(my_dict) 

das Problem ist, dass Druck die Sache nicht druckt in der gleichen Reihenfolge, wie sie in der Zeichenfolge erscheinen. Aufgrund meines Mangels an Python-Debugging-Kenntnissen weiß ich nicht, ob das findall() Werte in meinem Wörterbuch in zufälliger Reihenfolge speichert ... oder print(). Was ich brauche, ist eine Möglichkeit, Dinge in der Reihenfolge zu speichern, genau wie sie in der Zeichenkette erscheinen ... vielleicht durchfahren. jeder Vorschlag wird geschätzt, vielen Dank

+0

** [re.findall] (https://docs.python.org/2/library/re.html#re.findall) ** – rock321987

+1

Grund : http://stackoverflow.com/questions/15479928/why-is-the-order-in-python-dictionaries-and-sets-arbitrary – rock321987

+1

Auch http://stackoverflow.com/questions/9848034/is- there-a-function-in-like-re-findall-but-that-returns-wörterbuch-statt-von, http://stackoverflow.com/questions/25628973/capturing-named-groups-in-regex-with- re-findall –

Antwort

0

Es ist Ihr dict, das die Unordnung vorstellt. Re.findall gibt eine Liste in der Reihenfolge der Übereinstimmungen zurück. Mit dem Muster, das Sie verwenden, ist jeder Eintrag in der Liste selbst eine Liste (gut, ein Tupel) von zwei Werten, weil Sie zwei Gruppen im Muster haben. Verwenden Sie einfach den Rückgabewert von re.findall:

import re 
my_string = "a=1 b=10 z=234 h=5" 
matches = re.findall(r'(\S+)=(".*?"|\S+)', my_string) 
print matches 
for match in matches: 
    print match 

[('a', '1'), ('b', '10'), ('z', '234'), ('h', '5')] 
('a', '1') 
('b', '10') 
('z', '234') 
('h', '5') 
+0

also das ist es. vielen Dank. Ich benutze Python seit 4 Tagen und es ist alles neu für mich. Darf ich Sie fragen, ob diese Liste von Tupeln Duplikate erlaubt? dh [('a', '1'), ('b', '10'), ('a', '1'), ('z', '234'), ('h', '5')]. da einige Werte in der Zeichenfolge dupliziert sind (im Grunde ist es ein Paket mit redundanten Feldern). –

+0

Ja, eine Liste kann Duplikate enthalten. – barny

0
>>> my_string 
'a=1 b=10 z=234 h=5' 
>>> import re 
>>> "{"+re.sub(r'(\w+)=', r"'\1':", re.sub(r'\s+', ',', my_string))+"}" 
"{'a':1,'b':10,'z':234,'h':5}" 
>>> import ast 
>>> ast.literal_eval("{"+re.sub(r'(\w+)=', r"'\1':", re.sub(r'\s+', ',', my_string))+"}") 
{'a': 1, 'b': 10, 'h': 5, 'z': 234} 
>>> type(ast.literal_eval("{"+re.sub(r'(\w+)=', r"'\1':", re.sub(r'\s+', ',', my_string))+"}")) 
<class 'dict'> 
>>> 
Verwandte Themen