使用python正则表达式查找由逗号分隔的key=value对,但将带引号的部分保留在一起
如何从以下字符串中获取键、值对:使用python正则表达式查找由逗号分隔的key=value对,但将带引号的部分保留在一起,python,regex,key,Python,Regex,Key,如何从以下字符串中获取键、值对: s='pairs=<A=name,B=2,C="Last, First">' 但结果并非如此: [('A', 'name'), ('B', '2'), ('C', '"Last')] 如何忽略引号中的逗号 编辑 我犯了一个错误。我原来的正则表达式模式不应该工作,如果键可以有小写字母 我考虑到了这一点,并结合了eph和vks的解决方案: s='Pairs=<Aa=name,Bb=2,Cc="Last, First">' re.finda
s='pairs=<A=name,B=2,C="Last, First">'
但结果并非如此:
[('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])
s='Pairs='Pairs'
关于findall('([A-Za-z]+[0-9]*)=(“[^”]*“[^,]*)”,关于findall(r“]*)>”,s)[0])
这似乎奏效了
此解决方案的改进?正确的方法是提取
之间的所有内容,然后按拆分,
不在引号中
re.findall('([A-Z]+[0-9]*)=("[^"]*"|[^,]*)', s)
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']]
]*)>
可能不是最佳选择,因为不清楚值部分是否会出现
。@eph括号内的部分question@vks谢谢!它比我原来的解决方案更简洁。我也喜欢eph的解决方案,因为它使用简单的正则表达式模式匹配。@xyliu00-yo您当前改进的解决方案有许多缺陷…密钥的格式是固定的…最可靠的方法是以正确的方式…按,
拆分,然后按=
拆分。我在问题中犯了一个错误,我忽略了密钥也可以有小写的事实。我考虑到了这一点,并结合了您和vks的解决方案:re.findall(“([A-Za-z]+[0-9]*)=(“[^”]*“[^,]*)”,关于findall(r“]*)>”,s)[0])。这似乎奏效了。有更好的方法吗?@xyliu00这取决于更多的细节。例如,s
是否为parts1=,parts2=
或parts=
或parts=每行仅一个parts1=。我们可以假定<|>|“|=在引用的值内。但是,与其他方提供的任何文件一样,这是不保证的。@xyliu00如果“
可以在引用的值内,则必须存在某种转义方法或歧义。
s='pairs=<A=name,B=2,C="Last, First">'
print re.split(r',(?=(?:[^"]*"[^"]*")*[^"]*$)',re.findall(r"<([^>]*)>",s)[0])
print map(lambda x:x.split("="),z)