LINUX.ORG.RU

Парсинг собственного формата

 , ,


2

1

Добрый день, Лоровцы. Допустим, я решил придумал новый формат, в котором буду хранить данные своей программы(текстовый вид), но в связи с незнанием некоторых моментов, хотел спросить, как можно в Python распарсить следующий вид данных?

$a = [asd:asd:asd:asd];

либо

$a = [
     asd:asd:asd:
     asd:asd:asd
];

Буду очень благодарен за помощь.

Может проще взять готовый для которого уже есть готовые средства? Например, такой: https://docs.python.org/3.6/library/configparser.html По-моему, там можно было даже прикрутить свои типы данных.

Ты можешь так же изобрести свой конфиг и написать к нему парсер на основе одной из либ (https://wiki.python.org/moin/LanguageParsing), но лучше не делай так.

true_admin ★★★★★
()

Если внутри элементов не могут встречаться разделители =, [, ], :, то всё просто — используй обычный метод split(разделитель) у входной строки.

kvap
()
Ответ на: комментарий от true_admin

С готовыми я уже не раз сталкивался, но хотел изобрести нечто сферическое в вакууме, и своё.

Спасибо за ссылки, почитаю. :)

mahalaka ★★
() автор топика

Возьми *.ini или JSON и не создавай проблем ни себе ни другим, кто будет юзать то что ты велосипедишь.

deep-purple ★★★★★
()
Ответ на: комментарий от kvap

Это я знаю. Но соль в том, что мне, допустим, распарсить первую предоставленную мной строчку, и сложить её в словарь, где $а будет как-бы названием переменной, а инфа в скобках - её содержанием.

mahalaka ★★
() автор топика

вот так:

$a = ['my.cool.fmt' => 'asd:asd:asd:asd'];
var_dump(json_encode($a));
anonymous
()
Ответ на: комментарий от mahalaka

Мопед не мой, но всё же: PLY (Python Lex-Yacc) скорей всего то, что ты ищешь.

beastie ★★★★★
()
Ответ на: комментарий от deep-purple

Да с ini-json я уже достаточно знаком, мне больше интересно как можно по-уному распарсить некий синтаксис в Python, конкретно этот.

mahalaka ★★
() автор топика
Ответ на: комментарий от mahalaka

Достаточно знаком и уже написал удобную либу для конвертации в обе стороны?

deep-purple ★★★★★
()
Ответ на: комментарий от mahalaka

$a = [asd:asd:asd:asd];

Ну это вообще можно руками распарсить при помощи str.split и re.find . Будет слабочитаемый говнопарсер, но зато в пару строк. Но всё же возьми какой-нить json или ini.

true_admin ★★★★★
()

Почитай классиков, например «Компиляторы: принципы, технологии и инструменты»

Yur4eg ★★
()

Больше форматов богу форматов! Больше костылей трону костылей!

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 1)
Ответ на: комментарий от mahalaka
s = '$a = [asd:bsd:csd]'
key, value = (x.strip() for x in s.split('=', 1))
mydict[key] = value
kvap
()
Ответ на: комментарий от Dred

Руки отрывать за такие советы.

ТС, реализаций PEG для Питона полно.

anonymous
()

Пишешь парсер, потом парсер комбинатор. Делаешь пандорический захват, лифтишь в монаду, потом строишь рекурсивную схему (здесь подойдёт зигохистоморфный препроморфизм) как монадический трансформер из категории эндофункторов, и метациклически вычисляешь результат. Любой второкурсник справится. А если делать на анафорических лямбдах — так задачка вообще на пять минут.

anonymous
()

Всем спасибо огромное, узнал много нового, буду пробовать. :) Спасибо!

mahalaka ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.