Expressão regular para corresponder à lista separada por vírgulas de key = value em que value pode conter vírgulas
Eu tenho um "analisador" ingênuo que simplesmente faz algo como:[x.split('=') for x in mystring.split(',')]
No entanto mystring pode ser algo como'foo=bar,breakfast=spam,eggs'
Obviamente,
O divisor ingênuo simplesmente não fará isso. Estou limitado aBiblioteca padrão do Python 2.6 por esta,
Então, por exemplopyparsing não pode ser usado.
A saída esperada é[('foo', 'bar'), ('breakfast', 'spam,eggs')]
Eu estou tentando fazer isso com regex, mas estou enfrentando os seguintes problemas:
Minha primeira tentativar'([a-z_]+)=(.+),?'
Deu-me[('foo', 'bar,breakfast=spam,eggs')]
Obviamente,
Fazer.+
não-ganancioso não resolve o problema.
Assim,
Eu estou supondo que eu tenho que de alguma forma fazer a última vírgula (ou$
) obrigatório.
Fazer exatamente isso não funcionar'([a-z_]+)=(.+?)(?:,|$)'
Como com isso, o material por trás da vírgula em um valor contendo um é omitido,
por exemplo.[('foo', 'bar'), ('breakfast', 'spam')]
Eu acho que devo usar algum tipo de operação de look-behind (?).
As questões)
1Qual eu uso? ou
2Como eu faço isso / isso?
Editar:
Baseado emdaramarakresposta abaixo,
Acabei fazendo praticamente a mesma coisa queabarcar mais tardesugerido em uma forma ligeiramente mais detalhada;
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
EDIT 2:
Apenas para satisfazer a minha curiosidade, isso é realmente possível compuro expressões regulares? Ou seja, quere.findall()
retornaria uma lista de 2-tuplas?