我有一个字符串,看起来类似于以下内容:
myString = "major: 11, minor: 31, name: A=1,B=1,C=1,P=1, severity: 0, comment: this is down"
到目前为止我已尝试过这个:
dict(elem.split(':') for elem in myString.split(','))
它可以正常工作,直到它捕获名称元素,而{name}元素不能split()
':'
。
我希望将这些格式的元素作为新词典,例如。
myDic = {'major':'11', 'minor': '31', 'name':{'A':'1', 'B':'1', 'C':'1', 'P', '1'}, 'severity': '0', 'comment': 'this is down'}
如果可能的话,我希望避免复杂的解析,因为这些难以维护。 另外,我不知道上面字符串中的键或值的名称/数量。我只知道格式。这不是JSON响应,这是文件中文本的一部分,我无法控制当前格式。
答案 0 :(得分:1)
仅供参考,这不是完整的解决方案..
如果这是您输入的 具体结构 ,并且将是您的来源中的常量模式,则可以区分逗号分隔代币。
major: 11
和name: A=1,B=1,C=1,P=1,
之间的区别在于第一个令牌后面有 SPACE ,这与第二个令牌有所不同。因此,只需在第二个split
方法中添加空格,即可正确渲染字符串。
所以,代码应该是这样的:
dict(elem.split(':') for elem in myString.split(', '))
注意发送拆分方法。有一个空格和逗号...
关于JSON格式,我猜它需要更多的工作。我现在不知道..
答案 1 :(得分:0)
这是另一个建议。
为什么不将它转换为字典表示法。
E.g。在第一步中,通过将其包装在大括号中并将'='替换为'='来替换包含'='(和mybe no空格,我不知道)的':'和(逗号或输入结尾)之间的所有内容':'。
在第二步中,将':'和(逗号或输入结尾)之间的所有内容包装在'中,删除尾随和前导空格。
最后,你把它全部用括号括起来。
我仍然不相信那种语法,但是...可能已经成功处理了几千行......
答案 2 :(得分:0)
至少,这正确地解析了给定的例子......
import re
def parse(s):
rx = r"""(?x)
(\w+) \s* : \s*
(
(?: \w+ = \w+,)*
(?: \w+ = \w+)
|
(?: [^,]+)
)
"""
r = {}
for key, val in re.findall(rx, s):
if '=' in val:
val = dict(x.split('=') for x in val.split(','))
r[key] = val
return r
myString = "major: 11, minor: 31, name: A=1,B=1,C=1,P=1, severity: 0, comment: this is down"
print parse(myString)
# {'comment': 'this is down', 'major': '11', 'name': {'A': '1', 'P': '1', 'C': '1', 'B': '1'}, 'minor': '31', 'severity': '0'}