拆分字符串并创建键值对

5

我在Python中有以下字符串:

Date: 07/14/1995 Time: 11:31:50 Subject text: Something-cool

我希望能从中创建一个 dict(),其中包含以下 key: [value]
{"Date":["07/13/1995"], "Time": ["11:31:50"], "Subject text":["Something-cool"]}

如果我用冒号:分割字符串,我会得到以下结果。如何获得上述所需的结果?
>>> text.split(": ")
['Date', '07/14/1995 Time', '11:31:50 Subject text', 'Something-cool']

由于您的值始终是一个单词,我猜您可以在 text.split(": ") 中对每个值(除了第一个和最后一个)进行 .split(' '),然后将第一个结果作为值,其余作为键。 - Jordan A.
类似于“时间:晚上11:30 文本:某些内容”这样的东西是否可能?值中带有空格吗? - user3483203
1个回答

8

让我们在这里使用re.findall

>>> import re
>>> dict(re.findall(r'(?=\S|^)(.+?): (\S+)', text))
{'Date': '07/14/1995', 'Subject text': 'Something-cool', 'Time': '11:31:50'}

或者,如果您坚持使用这种格式,
>>> {k : [v] for k, v in re.findall(r'(?=\S|^)(.+?): (\S+)', text)}
{
   'Date'        : ['07/14/1995'],
   'Subject text': ['Something-cool'],
   'Time'        : ['11:31:50']
}

细节

(?=   # lookahead 
\S    # anything that isn't a space
|     # OR
^     # start of line
) 
(.+?) # 1st capture group - 1 or more characters, until...
:     # ...a colon
\s    # space
(\S+) # 2nd capture group - one or more characters that are not wsp 

语义上,这个正则表达式的意思是“给我所有符合特定模式的项对,该模式由某些内容、冒号和空格以及一堆非空格字符组成”。开始的前瞻是为了避免捕获前导空格(而且回溯只支持固定宽度的断言)。
请注意:如果值中有空格,则此方法将失败。
如果您要在文本文件中处理多行数据,可以基于此正则表达式并使用defaultdict。
from collections import defaultdict
d = defaultdict(list)

with open(file) as f:
    for text in file:
        for k, v in re.findall(r'(?=\S|^)(.+?): (\S+)', text.rstrip()):
            d[k].append(v)

这将在给定的键上为您的字典添加一个或多个值。


@Anthony 我已经尽我最大努力以直观的方式解释了正则表达式(正则表达式绝不是直观的),所以如果你在这里有任何不理解的地方,请随时问我。 - cs95
我认为我将不得不采用第二种方法。我的意图是为单个键拥有多个值。因此,我需要这些值是一个列表。 - Anthony
我会遇到某些情况,其中值中会有空格。有没有办法解决这个问题? - Anthony
@Anthony 好的。如果你正在遍历文本文件中的多行内容,我已经添加了一个基于defaultdict的解决方案,应该会有所帮助。 - cs95
2
@Anthony 只需遵循 PEP8 并且不允许在键中使用空格,那么您就可以在值中使用空格,只需限制其中一个即可。 - user3483203
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接