Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python正则表达式查找由逗号分隔的key=value对,但将带引号的部分保留在一起_Python_Regex_Key - Fatal编程技术网

使用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)