2012-11-27 13 views
8

Czy można uzyskać dostęp do symbolicznej nazwy grupy zdefiniowanej w wyrażeniu regularnym za pomocą (?P<toto>...) z odpowiednikiem re.findall()?Jak używać symbolicznej nazwy grupy za pomocą re.findall()

Przy użyciu re.match(), ponownie zwraca MatchObject, w którym można użyć funkcji .group('toto') ... Chciałbym zrobić coś blisko.

Oto przykład:

import re 
my_str = 'toto=1, bip=xyz, toto=15, bip=abu' 
print re.findall('toto=(?P<toto>\d+)\,\sbip=(?P<bip>\w+)', my_str) 

Zwraca:

[('1', 'xyz'), ('15', 'abu')] 

Chciałbym uzyskać coś takiego:

[{'toto':'1', 'bip':'xyz'}, {'toto':'15', 'bip':'abu'}] 

Czy istnieje prosty sposób to zrobić? Nie mogę go nigdzie znaleźć ...

Odpowiedz

9

Nie można tego zrobić z .findall(). Jednak może osiągnąć ten sam efekt z .finditer() i trochę listowych Magic:

print [m.groupdict() for m in re.finditer('toto=(?P<toto>\d+)\,\sbip=(?P<bip>\w+)', my_str)] 

Drukuje:

[{'toto': '1', 'bip': 'xyz'}, {'toto': '15', 'bip': 'abu'}] 

więc pętla nad każdym meczu uzyskanych przez .finditer() i wziąć to .groupdict() wynik.

+0

Dzięki! Działa doskonale i mogę nawet użyć go bezpośrednio do pętli na iteratorze! –

Powiązane problemy