我在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']
答案 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)
这将为您的字典添加一个或多个值以用于给定键。