Регулярное выражение для соответствия разделенному запятыми списку ключ = значение, где значение может содержать запятые
У меня есть наивныйанализатор» это просто делает что-то вроде:[x.split('=') for x in mystring.split(',')]
Однако mystring может быть что-то вроде'foo=bar,breakfast=spam,eggs'
Очевидно, что
Наивный сплиттер просто не сделает этого. Я ограниченСтандартная библиотека Python 2.6 за это,
Так напримерPyparsing не может быть использован.
Ожидаемый результат isI '[('foo', 'bar'), ('breakfast', 'spam,eggs')]
Я пытаюсь сделать это с помощью регулярных выражений, но сталкиваюсь со следующими проблемами:
Моя первая попыткаr'([a-z_]+)=(.+),?'
Дал мне[('foo', 'bar,breakfast=spam,eggs')]
Очевидно, что
Изготовление.+
не жадный не решает проблему.
Так что я'
Я предполагаю, что я должен как-то сделать последнюю запятую (или$
) обязательный.
Делать то, что на самом деле не работает,r'([a-z_]+)=(.+?)(?:,|$)'
Как и в этом случае материал за запятой в значении, содержащем единицу, опущен,
например[('foo', 'bar'), ('breakfast', 'spam')]
Я думаю, что я должен использовать какую-то операцию по просмотру (?).
Вопросы)
1.Который из я использую? или же
2.Как я делаю это / это?
Редактировать:
На основеdaramarak»ответ ниже,
В итоге я сделал то же самое, что иabarnert потомпредложенный в несколько более многословной форме;
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
РЕДАКТИРОВАТЬ 2:
Просто чтобы удовлетворить мое любопытство, возможно ли это счистый регулярные выражения? Т. Е. Чтобыre.findall()
вернул бы список из 2-х кортежей?