gpt4 book ai didi

Python:从格式化字符串中提取字段

转载 作者:行者123 更新时间:2023-11-28 22:35:58 24 4
gpt4 key购买 nike

我有一个字符串列表,这些字符串被格式化为键/值对,以空格分隔。例如,消息可能是:

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

有几点需要注意:

  1. 我希望 levelsequenceNum 是数字,而不是字符串
  2. 时间戳、主题和消息中可以有空格,所以我不能只按空格拆分
  3. 消息和主题可能包含任何内容,因此我也无法在标签或等号 上拆分。但是,它们将始终是字符串中的倒数第二个和最后一个。如果我们能够解决主题可能包含字符串 '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'])

我想知道是否可以从另一个方向来做。

最佳答案

为此,我会使用正则表达式。这可能不是最快(性能方面)或最容易(理解)的解决方案,但它肯定会起作用。 (这可能是您最接近“反向格式”的方式)

import re

pattern = re.compile(
"time=(?P<time>.+)\s"
"level=(?P<level>\d+)\s"
"sequenceNum=(?P<sequenceNum>\d+)\s"
"user=(?P<user>\w+)\s"
"subject=(?P<subject>.+?)\s" # <-- EDIT: changed from greedy '.+' to non-greedy '.+?'
"message=(?P<message>.+)"
)

lines = ["time=2016/06/14 16:44:00.000 level=1 sequenceNum=35 user=Username subject=subject goes here message=This is a message",
"time=2016/06/14 16:44:00.000 level=1 sequenceNum=35 user=Username subject=subject goes here message=This is a message=hello"]

for line in lines:
match = pattern.match(line)
item = match.groupdict()
print(item)

要获得数字形式的数字,您可以执行类似 result['level'] = int(result['level']) 的操作。

如果您有兴趣,我可以详细介绍一下我是如何构建正则表达式的,以及如何改进它。

编辑:更改表达式以涵盖 message= 在主题中的边缘情况。

关于Python:从格式化字符串中提取字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37821977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com