@Pyty

Как написать parser для txt в словарь с использованием regex pyton?

Нужно написать parser для файла с таким содержанием:
{## bonus:DS ##}
{## bang:fm,bv ##}

{## zf:123,230 ##} # примечание
{## zf1:349,410 ##}
{## pred:WE ##}

sadf sad ghjsgydk as

{## grable:Бараш-прототепин.f31.txt ##}
{## grable:Бараш-вкк yyy.s34.swt; ##}

rtsaydi ioi adioidsou asdy

{## da_vate: ##}

{# pronpun #}

{## te_zagol: + ##}
{## te_zagol2 : +##}
{## te_opisanie : b ##}
{## te_podtver_vushe_pricr :+ ##}
{## te_golde_babck : ##}

на выходе словарь 'grandle' - это список, 'zf' - список с кортежем, все остальные пары (ключ-значене):

{ 'grable': ['Бараш-прототепин.f31.txt', 'grable:Бараш-вкк yyy.s34.swt'], # это список
'bonus': 'DS',
'te_podtver_vushe_pricr': '+',
'te_golde_babck': '',
'te_opisanie': 'b',
'da_vate': '',
'te_zagol': '+',
'te_zagol2': '+',
'bang': 'fm,bv',
'zf': {('zf', '123,230'), ('zf1': '349, 410')], # cписок из кортежей

все что у меня получилось:
import re
def get_template_vars(filename):
result = {}
with open(filename, encoding='UTF-8') as lines:
for line in lines:
f = re.search(r,line)
result[f]

print (result)

python изучаю пару дней..

Благодарю за помощь.
  • Вопрос задан
  • 2826 просмотров
Пригласить эксперта
Ответы на вопрос 3
vvpoloskin
@vvpoloskin
Инженер связи
Вы хотите, чтобы здесь люди сделали за вас вашу работу?
Ответ написан
Комментировать
@traims
1. Допустим, мы хотим поймать всё, что находится между символами {## и ##}. Как будет выглядеть регулярное выражение?

Нам всё равно, какие символы будут встречаться внутри, поэтому можно поставить точку — произвольный символ. Пусть этот символ будет повторяться произвольное число раз — добавляем звёздочку. Нам надо поймать всё, что находится между {## и ##} — добавляем круглые скобки, чтобы обозначить границы группы:
{## (.*) ##}
Можно немного изменить это регулярное выражение, например, поставить знак "+" вместо звёздочки — это будет означать, что произвольный символ должен встретиться хотя бы один раз (звёздочка означает, что он может встретиться ноль или более раз).

2. Как использовать это регулярное выражение?

Можно применять его к каждой строке файла по очереди. А можно применить ко всему файлу целиком, если он небольшой.

Допустим, мы считываем весь файл в одну строковую переменную:
with open('input.txt', 'r') as f:
    text = f.read()

Тогда мы можем вытащить из него сразу всё, что нас интересует:
import re
pattern = "{## (.*) ##}"
result = re.findall(pattern, text)

Результатом будет список строк вида
['bonus:DS',
'bang:fm,bv',
'zf:123,230',
'zf1:349,410',
... ]

Здесь каждую строку можно разбить на две:
s = 'bonus:DS'
s.split(':')  # получаем ['bonus', 'DS']

— и дальше действовать как потребуется.

3. Что получится, если включить двоеточие сразу в регулярное выражение?

Чтобы обойтись без использования split(), можно изначально включить двоеточие в наше регулярное выражение:
pattern = "{## (.*):(.*) ##}"
Результатом будет список кортежей:
[('bonus', 'DS'),
('bang', 'fm,bv'),
('zf', '123,230'),
('zf1', '349,410'),
... ]


4. Как собирать различные структуры данных с нуля?

Примеры того, как можно собрать с нуля списки, словари и кортежи. Все примеры легко проверить в командной строке.

Списки:
list = []
list.append('a')

Пары ключ-значение (словари):
d = dict()
d['a'] = '123'

Кортежи:
x = '123'
y = '456'
tuple = (x, y)

По идее, этой информации должно быть достаточно, чтобы вы смогли разобраться в путях решения задачи. Удачи!
Ответ написан
Комментировать
@Pyty Автор вопроса
Я хочу чтобы люди дали советы как это делать, человеку у которого нет опыта, возможно помогли найти решение или хотябы направили в нужном направлении.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы