【发布时间】:2016-10-15 18:34:51
【问题描述】:
我有一个格式为键/值对的字符串列表,由空格分隔。例如,一条消息可能是:
"time=2016/06/14 16:44:00.000 level=1 sequenceNum=35 user=Username subject=subject goes here message=This is a message"
键/值对将始终按此顺序排列,消息将始终采用此格式。我想把这个字符串转换成这样形式的字典:
{'level': 1,
'message': 'This is a message',
'sequenceNum': 35,
'subject': 'subject goes here',
'time': '2016/06/14 16:44:00.000',
'user': 'Username'}
需要注意的几点:
- 我希望
level和sequenceNum是数字,而不是字符串 - 时间戳、主题和消息中可以有空格,所以我不能只用空格分割
- 邮件和主题可能包含任何内容,所以我也不能在标签上拆分或等号。但是,它们将始终是字符串中倒数第二个和最后一个的东西。如果我们可以解决主题可能包含字符串
'message='的问题,这样就无法区分主题结束和消息开始的位置,那很好,但现在我愿意忽略这个问题。李>
目前我拥有的最好的是:
item = {}
item['time'] = message[5:message.index('level=')].strip()
message = message[message.index('level='):]
item['level'] = int(message[6:message.index('sequenceNum=')].strip())
message = message[message.index('sequenceNum='):]
#etc.
我不是很喜欢这个,尽管它显然可以正常工作。我希望有一种基于字符串格式的更优雅的方法。例如,如果我试图创建这个字符串,我可以使用这个:
"time=%s level=%s sequenceNum=%s user=%s subject=%s message=%s" % (item['time'], item['level'], item['sequenceNum'], item['user'], item['subject'], item['message'])
我想知道是否可以在另一个方向上这样做。
【问题讨论】:
-
值可以包含任何东西吗?这会是一个有效的主题吗?
subject=a message=This is a message=subject=message=1=hello。您应该避免在值字符串中使用=字符。 -
@HåkenLid 的主题和消息值可以包含任何内容。其余的更可靠地固定。是的,你的例子是一个有效的主题。我想处理
=和主题和消息中的标签。我现在唯一愿意忽略的是包含" message="的主题。这与消息的开头是不可能区分的。但是例如包含" subject="的消息是可管理的,因为标签是固定且有序的。 -
我希望提出这种荒谬消息格式的人被解雇。
-
@HåkenLid 它是连接到远程系统的 CLI 的输出。它需要简洁但可读。除了人类阅读之外,它从未打算被任何其他人解析。
标签: python regex parsing dictionary