使用 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"']]
如何从以下字符串中获取键值对:
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"']]