Регулярное выражение для соответствия разделенному запятыми списку ключ = значение, где значение может содержать запятые

У меня есть наивныйанализатор» это просто делает что-то вроде:

[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-х кортежей?

Ответы на вопрос(5)

Ваш ответ на вопрос