将括号分隔的字符串拆分为字典

Posted

技术标签:

【中文标题】将括号分隔的字符串拆分为字典【英文标题】:Splitting bracket-separated string to a dictionary 【发布时间】:2017-03-12 19:11:23 【问题描述】:

我想让这个字符串成为字典。

s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y)'

关注

'SEQ':'A=1%B=2', 'OPS':'CC=0%G=2', 'T1':'R=N', 'T2':'R=Y'

我试过这个代码

d = dict(item.split('(') for item in s.split(')'))

但是发生了错误

ValueError: dictionary update sequence element #4 has length 1; 2 is required

我知道为什么会出现这个错误,解决方法是删除end的括号

s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y'

但这对我不利。有没有其他好的解决方案可以让这个字符串成为字典类型...?

【问题讨论】:

【参考方案1】:

更简洁:

import re

s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y)'
print dict(re.findall(r'(.+?)\((.*?)\)', s))

【讨论】:

完美的解决方案,更简洁的方法。【参考方案2】:

在生成器表达式中添加if 条件。

>>> s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y)'
>>> s.split(')')
['SEQ(A=1%B=2', 'OPS(CC=0%G=2', 'T1(R=N', 'T2(R=Y', '']
>>> d = dict(item.split('(') for item in s.split(')') if item!='')
>>> d
'T1': 'R=N', 'OPS': 'CC=0%G=2', 'T2': 'R=Y', 'SEQ': 'A=1%B=2'

【讨论】:

我还建议说 if item 而不是 if item !='' 因为 '' 无论如何都是一个空字符串。【参考方案3】:

或者,这可以通过正则表达式来解决:

>>> import re
>>> s = 'SEQ(A=1%B=2)OPS(CC=0%G=2)T1(R=N)T2(R=Y)'
>>> print dict(match.groups() for match in re.finditer('([^(]+)\(([^)]+)\)', s))
'T1': 'R=N', 'T2': 'R=Y', 'SEQ': 'A=1%B=2', 'OPS': 'CC=0%G=2'

【讨论】:

以上是关于将括号分隔的字符串拆分为字典的主要内容,如果未能解决你的问题,请参考以下文章

Java Regex - 拆分逗号分隔列表,但在括号内排除逗号

仅当分隔符存在于字符串上时,才使用两个不同的分隔符拆分 Python 字典中的字符串

目标 C:在括号之间拆分文本

Java Regex - 拆分逗号分隔列表但排除方括号内的逗号

将列字符串拆分为多个列字符串

将逗号分隔的字符串拆分为数组?