Pull to refresh

Comments 43

UFO just landed and posted this here
Порты есть. Но, во-первых, их надо отдельно ставить. А во-вторых, использование BNF-грамматики это ни разу не пять строчек кода, что во многих случаях является излишним усложнением проекта.
UFO just landed and posted this here
Как это не пять? У меня в последнем примере аккурат пять :). Просто для удобочитаемости развернуто по вертикали.

ConfigParser — он для узкого круга задач. Представленный же способ можно использовать для парсинга логов, леворезьбовых конфиг файлов, дампов и прочей текстовой информации.

Способ, на мой взгляд, занимает нишу аккурат между ConfigParser и PLY :). Не силвер баллет, конечно, но на мой взгляд для многих задач самое то. У меня ЭТИМ в текстовом редакторе ряд леворезьбовых внутренних синтаксисов подсвечивается — оч удобно.
UFO just landed and posted this here
Да, пожалуй разбор конфига в качестве примера — не очень удачное решение :). Но любой другой пример был бы, мягко говоря, объемнее. И так в статье слишком много букв получилось.
Это смотря каких логов. Есть некоторые логи, типа сквидового access.log, в которых все чётко по полям раскидано и простой split вполне справляется.
Зато PLY преобразует заданную грамматику в конченый автомат и позволяет его даже скомпилировать, хранить и загружать уже в виде конечного автомата. Один результирущий автомат содержит все регулярные выражения соотвествующие указанным в его определении токенам, в результате он оптимальнее чем пачка регулярок.

Вощем велосипед вы напиали, товарищ.

Уверен, что раньше вы программировали на PHP и поэтому не привыкли к философии Python «battaries-included».
Ага, я как раз этот PLY использую. И плююсь. Какой-то не python way у этой библиотеки, но ничего лучше нет.
Можно попытаться выдернуть кусочек из PyPy, лексер например.
Поздно уже :) Я уже много написал.
У этой библиотеки flex way. Поскольку она являтся портом flex на Python.
Мне. О разных вещах коллеги говорят. PLY и pyparsing — это серьезные библиотеки для парсинга всего. Но они требуют времени на изучение, их надо ставить, кода писать не мало. Показанный мной способ — это промежуточное между split() и указанными библиотеками. Для своего ряда задач :).
Я так, подзадорить :) ведь полярно разные мнения, грех не обратить внимание высказавшихся :)
Одну и ту же задачу как правило можно решить десятком разных способов :). Как показывает практика, разные библиотеки и подходы заточены под разные задачи — скорость, универсальность, количество кода, встроенность в язык и так далее. Чем больше разных способов человек знает тем лучше он, ИМХО, может выбрать инструмент для решения конкретной задачи. Как правило, решения «лучше» не существует просто потому, что многие характеристики взаимоисключающие — split() требует минимума кода, но не парсит ничего сложнее ini файлов. На PLY можно написать синтаксический анализатор PHP, но это обойдется в изучение технологии и сотни строк кода :)
Да я поверил уже на пару комментариев выше :) говорю же :)
Спасибо :)
Зря вы так. Ничего сложного в PLY нет. За пару вечеров она осваивается до уровня достаточного для написания простеньких лексических анализаторов размером с описанный в статье. По-моему сложно сть flex, ply и прочих генераторов лексических анализаторов приувеличена, а может сказывается мой один семестр университета по курсу «Теория компиляторов». :)
Библиотека хорошая. Просто в Python она встроена, как чужеродное тело.
Да, штука хорошая. Но те же минусы что и у PLY — нужно ставить (это я не к тому что сложно, а к тому что затрудняет разворачивание на машины конечных пользователей), нужно писать больше кода, нужно учить грамматику.
Это не минусы, это придирки: )

Регулярки это всё таки бомбометание по площадям, а уж чтобы конкретно их изучить надо в разы больше времени — ничего простого в них нет, а есть в них куча подводных камней о которых надо знать.
>> Если совсем кратко, то это такой язык программирования, который создан для поиска текста. Очень-очень простой язык программирования. Условий, циклов и функций у него нет…

Не совсем так. В Питоне есть минимум условные выражения. В реализациях других языков встречаются и рекурсии, т.е. практически циклы.

Вот что говорит документация про условие поиска:
(?(id/name)yes-pattern|no-pattern)
Will try to match with yes-pattern if the group with given id or name exists, and with no-pattern if it doesn’t. no-pattern is optional and can be omitted.

С чисто академической целью ваш последний паттерн можно было бы привратить во что-то подобное:
r'({)?(?(1)(?P<section>[^}\n]+])}|(?P<name>[^\n=]+)=(?P<value>[^\n=+]))'

Конечно, в такой реализации (если сначала найдена фигурная скобка искать section, в противном случае пару name=value) от него толку мало, но вот если понадобится обработать специфическим образом «number section», например, такая конструкция может помочь. Жаль только, что для условия обязательно нужно его захватывать и потом ссылаться по id или имени. В других реализациях можно писать что угодно, вплоть до заглядываний.
Сильно. Спасибо. Не знал :). Статью подправил.
Так одно дело прочитать, а другое запомнить. Если я буду детально помнить все доки по всем технологиям которые я когда-либо встречал… Вообщем, не могу похвастаться настолько хорошей памятью :).
Все и не надо. Но регулярки надо знать от и до.
Для .net, java, python, lua, perl, php, ruby, boost, qt, gtk? Для большинства реализаций есть много мелких различий :).
А вы на всём этом программируете? Я программирую на Perl, PHP, Python и Javascript. Для этих языков регулярки я знаю.
Нет, в основном я на С++ :(. А остальное все эпизодически ровным слоем.
А помнить не надо, просто если не прочитать, можно не знать о сущствовании нужной функции и пытаться самомстоятельно изобретать велосипеды.
Это да. Я стараюсь по мере сил, но иногда в списке из сотни одинаковых пунктов пара ускальзывает от внимания. Но я над этим работаю.
UFO just landed and posted this here
Это философский вопрос — что называть циклом в языке программирования :). «text» * 10 в питоне — это цикл или не цикл? :).
UFO just landed and posted this here
Строго говоря вы скорее всего правы. Хотя можно конечно ещё поговорить относительно того, насколько вообще пременимо слово «цикл» к конечным автоматам.

Ну а в данном случае под циклом я подразумевал именно человеко-очевидный цикл. Рекурсия в регулярках под него лучше всего подходит, как мне кажется.

Впрочем, верно написано выше — вопрос филосовский. )
UFO just landed and posted this here
А вы на больших логах, мегабайт так по 60, эти способы проверяли?
Yep. Замечательно парсит. Там ~O(n*m) где m не очень велико.
какой же это язык программирования, вы что?!!!
ну-ка напишите машину тьюринга.

это способ задания шаблонов.
Sign up to leave a comment.

Articles