使用 python 正则表达式查找以逗号分隔的键=值对,但将引号部分保持在一起

use python regex to find key=value pairs separated by comma but keep quoted portion together

如何从以下字符串中获取键值对:

s='pairs=<A=name,B=2,C="Last, First">'

括号< ... >内的部分为K=V对,以逗号分隔。值部分可以用引号括起来。

我笨拙的解决方案是获取括号之间的部分,找到不在引号中的逗号位置,找到逗号位置的子字符串,然后用'='拆分键/值,然后将整个东西变成字典.

正则表达式应该能够以更直接的方式做到这一点,对吧?

我走到这一步:

re.findall('([A-Z]+[0-9]*)=([^,]*)', s)

但结果并不正确:

[('A', 'name'), ('B', '2'), ('C', '"Last')]

如何忽略引号中的逗号?

编辑

我错了。如果键可以有小写字母,我原来的正则表达式模式应该不起作用。

我考虑到了这一点,并结合了 eph 和 vks 的解决方案:

s='Pairs=<Aa=name,Bb=2,Cc="Last, First">'
re.findall('([A-Za-z]+[0-9]*)=("[^"]*"|[^,]*)', re.findall(r"<([^>]*)>",s)[0]) 

它似乎有效。

改进这个解决方案?

re.findall('([A-Z]+[0-9]*)=("[^"]*"|[^,]*)', s)

正确的方法是提取 <> 之间的所有内容,然后按 , 拆分,而不是 quotes.

s='pairs=<A=name,B=2,C="Last, First">'
print re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)',re.findall(r"<([^>]*)>",s)[0])

输出:['A=name', 'B=2', 'C="Last, First"']

不,您可以通过拆分 = 轻松配对。

print map(lambda x:x.split("="),z)

输出:[['A', 'name'], ['B', '2'], ['C', '"Last, First"']]