如何从以下字符串中获取键值对:
s='pairs=<A=name,B=2,C="Last, First">'
括号内的部分&lt; ...&gt;包含K = V对,用逗号分隔。值部分可以在引号中使用逗号。
我笨重的解决方案是获取括号之间的部分,找到不在引号中的逗号位置,找到逗号位置的子串,然后用&#39; =&#39;分割键/值,然后转动整个对于一个字典的事情。
正则表达式应该能够以非常简单的方式做到这一点,对吗?
我到目前为止:
re.findall('([A-Z]+[0-9]*)=([^,]*)', s)
但结果并不合适:
[('A', 'name'), ('B', '2'), ('C', '"Last')]
如何忽略引号中的逗号?
我考虑到了这一点,并结合了eph和vks&#39;解决方案:
s='Pairs=<Aa=name,Bb=2,Cc="Last, First">'
re.findall('([A-Za-z]+[0-9]*)=("[^"]*"|[^,]*)', re.findall(r"<([^>]*)>",s)[0])
它似乎有效。
对此解决方案的改进?
答案 0 :(得分:1)
re.findall('([A-Z]+[0-9]*)=("[^"]*"|[^,]*)', s)
答案 1 :(得分:1)
正确的方法是在<>
之间提取所有内容,然后按,
分割,而不是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"']]