拆分字符串并生成键值对

时间:2018-05-27 03:16:33

标签: python string dictionary split

我在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']

1 个答案:

答案 0 :(得分:5)

我们在这里使用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 

从语义上讲,这个正则表达式意味着“让我所有的项目都遵循这个特定模式的东西,然后是冒号和空格以及一堆不是空格的字符”。在开始时的前瞻是这样的,不会使用前导空格捕获组(并且lookbehinds仅支持固定宽度的断言,所以)。

注意:如果您的值中包含空格,则会失败。

如果您在文本文件中为多行执行此操作,请使用此正则表达式并使用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)

这将为您的字典添加一个或多个值以用于给定键。