2012-11-27 7 views
8

È possibile accedere al nome di gruppo simbolico definito in un'espressione regolare con (?P<toto>...) con l'equivalente di re.findall()?Come utilizzare il nome di gruppo simbolico utilizzando re.findall()

Utilizzando re.match(), restituisce un MatchObject su cui è possibile utilizzare la funzione .group('toto') ... Vorrei fare qualcosa di simile.

Ecco un esempio:

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) 

Restituisce:

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

vorrei ottenere qualcosa di simile:

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

Esiste un modo semplice per farlo? Non riesco a trovarlo da nessuna parte ...

risposta

9

Non è possibile farlo con .findall(). Tuttavia, è può ottenere lo stesso effetto con .finditer() e qualche magia di lista:

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

Questo stampa:

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

Così abbiamo un ciclo su ogni partita prodotto da .finditer() e prendere è .groupdict() risultato.

+0

Grazie! Funziona perfettamente e posso anche usarlo direttamente per fare il ciclo sull'iteratore! –