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

时间:2016-10-30 13:37:05

标签: python string dictionary

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

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

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

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

但这对我不好。任何其他好的解决方案,使这个字符串成为字典类型......?

3 个答案:

答案 0 :(得分:6)

在生成器表达式中添加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'}

答案 1 :(得分:1)

或者,这可以用正则表达式解决:

>>> 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'}

答案 2 :(得分: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))