Что такое PyParsing? Как использовать PyParsing в качестве альтернативы Regex в Python? Введение в пакет PyParsing в Python с примерами.
Библиотека PyParsing Python предоставляет основу для создания анализаторов рекурсивного спуска. Это позволяет нам определять грамматики, используя комбинацию объектно-ориентированного и декларативного синтаксиса, что упрощает написание синтаксических анализаторов для сложных форматов текста или данных.
С помощью PyParsing мы можем определить структуру и правила грамматики, создав объекты синтаксического анализатора, которые представляют различные компоненты языка или форматируют наш синтаксический анализ. Эти компоненты могут включать литералы, регулярные выражения, операторы и многое другое. Затем мы можем комбинировать эти компоненты для создания более сложных выражений синтаксического анализа.
История
Пакет PyParsing был создан Полом Макгуайром в начале 2000-х как библиотека Python с открытым исходным кодом для анализа структурированного текста и данных. Пол Макгуайр был вдохновлен концепциями синтаксического анализа рекурсивного спуска и желанием иметь более выразительный и читаемый способ определения синтаксических анализаторов по сравнению с регулярными выражениями.
PyParsing был первоначально выпущен в 2003 году и завоевал популярность среди разработчиков, которым нужно было анализировать сложные и нетривиальные форматы данных. Библиотека обеспечивала абстракцию более высокого уровня по сравнению с регулярными выражениями, позволяя пользователям определять грамматику и правила синтаксического анализа с использованием комбинации объектно-ориентированного и декларативного синтаксиса.
За прошедшие годы PyParsing развивался и претерпел несколько обновлений и улучшений. Библиотека продолжала привлекать пользователей благодаря своей гибкости, простоте использования и мощным возможностям синтаксического анализа. Он нашел применение в различных областях, включая извлечение данных, разработку предметно-ориентированного языка (DSL), анализ файлов конфигурации и многое другое.
Пол МакГуайр активно поддерживал PyParsing и вносил в него свой вклад примерно до 2017 года. После этого сопровождение перешло к другим участникам сообщества, которые продолжали улучшать библиотеку и решать проблемы. PyParsing всегда был проектом с открытым исходным кодом, исходный код которого был доступен на таких платформах, как GitHub, для совместной работы и участия сообщества.
PyParsing как альтернатива регулярным выражениям
PyParsing можно рассматривать как альтернативу регулярным выражениям (регулярным выражениям) для задач синтаксического анализа, особенно при работе с более сложными грамматиками или структурированными данными. Хотя регулярные выражения отлично подходят для простого сопоставления с образцом и работы с текстом, они могут стать громоздкими и сложными в обслуживании, когда требования к синтаксическому анализу становятся более сложными.
Несколько причин, по которым PyParsing может быть предпочтительным выбором по сравнению с регулярным выражением для определенных задач синтаксического анализа:
Абстракции более высокого уровня. PyParsing позволяет определять синтаксические анализаторы с использованием абстракций высокого уровня, таких как объекты синтаксического анализа, выражения синтаксического анализа и правила грамматики. Это упрощает выражение сложных грамматик в более структурированном и удобочитаемом виде по сравнению с часто загадочным характером регулярных выражений.
Контекстный анализ: PyParsing отлично справляется с контекстным анализом, когда значение или достоверность шаблона зависит от окружающего его контекста. Это позволяет вам определять правила синтаксического анализа, которые учитывают контекст и применяют ограничения к анализируемым данным. С другой стороны, регулярные выражения, как правило, плохо подходят для обработки сложных контекстных зависимостей.
Обработка ошибок: PyParsing предоставляет встроенные механизмы для обработки ошибок и составления отчетов. Он позволяет вам определять сообщения об ошибках, обрабатывать исключения синтаксического анализа и восстанавливаться после ошибок контролируемым образом. Регулярные выражения, напротив, обычно не предлагают надежных возможностей обработки ошибок.
Генерация AST: PyParsing позволяет относительно легко генерировать абстрактные синтаксические деревья (AST) или структурированные данные из проанализированных входных данных. Он позволяет связать действия синтаксического анализа с различными грамматическими правилами, что позволяет преобразовывать проанализированные элементы в более осмысленное представление. В то время как регулярное выражение может извлекать определенные части строки, PyParsing предлагает большую гибкость в создании структурированных представлений данных.
Читаемость и ремонтопригодность: код PyParsing, как правило, более удобен для чтения и обслуживания по сравнению со сложными регулярными выражениями. Использование объектов, методов и операторов Python в PyParsing обеспечивает более интуитивно понятный и структурированный подход к определению синтаксических анализаторов, облегчая другим (включая вас в будущем) понимание и изменение логики синтаксического анализа.
Используйте PyParsing
Установить PyParsing
Если вы не установили PyParsing, вы можете сделать это, выполнив следующую команду:
pip install pyparsing
Импортировать необходимые классы и функции
В своем скрипте Python импортируйте классы и функции из модуля pyparsing, который вы будете использовать. Обычно используемые классы включают, среди прочего, Word, Literal, Combine, Group и Optional.
from pyparsing import Word, Literal, Combine, Group, Optional
Определите грамматику
Создайте объекты синтаксического анализатора и определите правила грамматики на основе ваших конкретных требований к синтаксическому анализу. Используйте классы и функции PyParsing для определения структуры и компонентов вашей грамматики. Это включает в себя указание литералов, шаблонов, операторов и их отношений.
# Example grammar for parsing a simple arithmetic expression integer = Word("0123456789") operator = Literal("+") | Literal("-") | Literal("*") | Literal("/") expression = integer + operator + integer
Применить парсер к входным данным
Как только грамматика определена, вы можете применить синтаксический анализатор к входным данным, используя метод parseString. Передайте входную строку синтаксическому анализатору, и он попытается сопоставить и проанализировать ввод на основе определенной грамматики.
input_string = "42 + 23" result = expression.parseString(input_string)
Доступ к проанализированным элементам
Метод parseString возвращает проанализированный результат, доступ к которому можно получить для извлечения проанализированных элементов. В зависимости от структуры вашей грамматики результатом может быть список, кортеж или другая структура данных, содержащая проанализированные токены.
print(result[0]) # Output: 42 print(result[1]) # Output: + print(result[2]) # Output: 23
Выполнить дальнейшую обработку или действия
При необходимости вы можете выполнять дополнительную обработку или действия над проанализированными элементами. Это может включать преобразование проанализированных данных в другой формат, построение абстрактного синтаксического дерева (AST) или применение пользовательских функций к проанализированным элементам.
# Example: Perform arithmetic calculation a = int(result[0]) operator = result[1] b = int(result[2]) if operator == '+': result = a + b elif operator == '-': result = a - b elif operator == '*': result = a * b elif operator == '/': result = a / b print(result) # Output: 65
Пример использования PyParsing в качестве альтернативы регулярному выражению
Давайте рассмотрим простой пример, когда мы хотим проанализировать строку, представляющую дату в формате «ГГГГ-ММ-ДД», используя PyParsing вместо регулярных выражений.
Использование регулярных выражений
Использование регулярных выражений (регулярных выражений) для анализа строки даты в формате «ГГГГ-ММ-ДД»:
import re # Define the regex pattern for parsing a date string date_pattern = r'^(\d{4})-(\d{2})-(\d{2})$' # Parse a sample date string input_string = "2023-06-23" match = re.match(date_pattern, input_string) if match: parsed_year = match.group(1) parsed_month = match.group(2) parsed_day = match.group(3) print(parsed_year) # Output: 2023 print(parsed_month) # Output: 06 print(parsed_day) # Output: 23 else: print("Invalid date format.")
Использование PyParsing
from pyparsing import Word, nums # Define the grammar for parsing a date string year = Word(nums, exact=4) month = Word(nums, exact=2) day = Word(nums, exact=2) date_parser = year + '-' + month + '-' + day # Parse a sample date string input_string = "2023-06-23" parsed_result = date_parser.parseString(input_string) # Access the parsed elements parsed_year = parsed_result[0] parsed_month = parsed_result[1] parsed_day = parsed_result[2] print(parsed_year) # Output: 2023 print(parsed_month) # Output: 06 print(parsed_day) # Output: 23
Регулярные выражения все еще имеют свое место и идеально подходят для многих простых задач синтаксического анализа. Они часто быстрее и легче, чем PyParsing, что делает их хорошим выбором, когда производительность является критическим фактором или для основных операций со строками. Однако при работе с более сложными сценариями синтаксического анализа PyParsing предоставляет более мощный и выразительный набор инструментов.
— — —
Почему синтаксический анализатор разорился?
Потому что он потратил все свое время на поиск соответствия, но не смог найти нужное!
🙂🙂🙂