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

时间:2015-12-04 05:35:28

标签: python regex key

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

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]) 

它似乎有效。

对此解决方案的改进?

2 个答案:

答案 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"']]