Как записать результаты re python в словарь?

Добрый день.

Извиняюсь за идиотский вопрос. Всю голову уже сломал, но ощущение, что ответ очень прост не даёт пакоя

Есть текст

Вася - 10
Ваня -20
Петя -30

Хочу получить

[{'name' : 'Вася', 'value': 10},
{'name' : 'Ваня', 'value': 20},
{'name' : 'Петя', 'value': 30}]

Делаю

res=[]
for i in text.split("/r"):
	reg = re.match('(?P<type>.*) - (?P<value>.*)',i)
	res.append(reg.groupdict())


Но получаю только 1 элемент в массиве. Что не так? Буду благодарен, если напишите решение короче. Заранее спасибо.
  • Вопрос задан
  • 2904 просмотра
Решения вопроса 1
adugin
@adugin Куратор тега Python
# -*- coding: utf-8 -*-
import re

text = u"""Вася - 10
Ваня - 20
Петя - 30"""

d = dict(re.findall(u"^(.+?) - (\d+?)$", text, flags=re.M|re.U))

print d

Если нужен именно список словарей - то, например, так:
p = re.compile(u"^(?P<name>.+?) - (?P<value>\d+?)$", flags=re.M|re.U)
d = [match.groupdict() for match in p.finditer(text)]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
adugin
@adugin Куратор тега Python
P.S. Вообще, у Вас две проблемы:

1) Только первая строка содержит " - ", две другие содержат " -". Регулярку следует проапгрейдить до:

p = re.compile(ur"^(?P<name>.+?)[ ]*-[ ]*(?P<value>\d+?)$", flags=re.M|re.U)


2) Вместо "жадных" регулярок вида .* использовать ungreedy-версии .*? или .+?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы