我有一个天真的“解析器”,它只是做类似的事情:
[x.split('=') for x in mystring.split(',')]
但是 mystring 可以是
'foo=bar,breakfast=spam,eggs'
显然,
天真的分离器不会这样做。为此,我仅限于Python 2.6 标准库,因此不能使用
例如pyparsing 。
预期输出为
[('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 元组列表?