【问题标题】:split string and make key value pair拆分字符串并制作键值对
【发布时间】:2018-11-06 00:08:41
【问题描述】:

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

【问题讨论】:

  • 由于你的值总是一个词,我猜你可以.split(' ')text.split(": ")中的每个值(除了第一个和最后一个),然后将第一个结果作为值,其余的作为键。
  • Time: 11:30 PM text: something 这样的可能吗?值中有空格?

标签: python string dictionary split


【解决方案1】:

让我们在这里使用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 我已经尽我所能尽可能直观地解释正则表达式(正则表达式绝不是直观的),所以请随时向我询问任何你不明白的地方.
  • 我想我将不得不采用第二种方法。我的意图是为单个键设置多个值。所以我需要将这些值作为一个列表。
  • 在某些情况下,值中有空格。有办法解决吗?
  • @Anthony 好的。如果您要遍历文本文件中的多行,我添加了一个基于 defaultdict 的解决方案,应该会有所帮助。
  • @Anthony 只需遵循 PEP8 并且不允许您的键中有空格,那么您的值中可以有空格,您只需要限制其中一个即可。
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2016-12-13
相关资源
最近更新 更多