Давайте использовать 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)
Thisдобавит одно или несколько значений в ваш словарь для данного ключа.