Wyrażenie regularne pasujące do rozdzielonej przecinkami listy klucz = wartość, gdzie wartość może zawierać przecinki
Mam naiwny „parser”, który po prostu robi coś takiego:[x.split('=') for x in mystring.split(',')]
Jednak mystring może być czymś w rodzaju'foo=bar,breakfast=spam,eggs'
Oczywiście,
Naiwny rozdzielacz po prostu tego nie zrobi. Jestem ograniczony doStandardowa biblioteka Pythona 2.6 dla tego,
Na przykładparsowanie nie może być użyty.
Oczekiwany wynik to[('foo', 'bar'), ('breakfast', 'spam,eggs')]
Próbuję to zrobić za pomocą wyrażenia regularnego, ale napotykam następujące problemy:
Moja pierwsza próbar'([a-z_]+)=(.+),?'
Dałeś mi[('foo', 'bar,breakfast=spam,eggs')]
Oczywiście,
Zrobienie.+
nie chciwy nie rozwiązuje problemu.
Więc,
Zgaduję, że muszę jakoś zrobić ostatni przecinek (lub$
) obowiązkowy.
Po prostu to nie działa,r'([a-z_]+)=(.+?)(?:,|$)'
Tak jak w przypadku, rzeczy za przecinkiem w wartości zawierającej jeden są pomijane,
na przykład[('foo', 'bar'), ('breakfast', 'spam')]
Myślę, że muszę użyć pewnego rodzaju operacji „?”.
Pytania)
1Który czy używam? lub
2.W jaki sposób mam to zrobić / to?
Edytować:
Oparte nadaramarakodpowiedź poniżej,
Skończyło się tak samo jakabarnert późniejzasugerował w nieco bardziej szczegółowej formie;
vals = [x.rsplit(',', 1) for x in (data.split('='))]
ret = list()
while vals:
value = vals.pop()[0]
key = vals[-1].pop()
ret.append((key, value))
if len(vals[-1]) == 0:
break
EDYCJA 2:
Aby zaspokoić moją ciekawość, jest to możliweczysty wyrażenia regularne? To znaczy takre.findall()
zwróci listę 2 krotek?