Что такое 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 предоставляет более мощный и выразительный набор инструментов.

— — —

Почему синтаксический анализатор разорился?

Потому что он потратил все свое время на поиск соответствия, но не смог найти нужное!

🙂🙂🙂