ПРОБЛЕМА: Я ищу библиотеку python, в которой уже может быть реализован анализатор текста, написанный на другом языке.
У меня есть строки текста, которые представляют либо команды конфигурации в устройствах, либо динамические c выходные данные команд, запускаемых на устройствах. Для простоты предположим, что каждая строка анализируется независимо. Суть в том, что строка содержит фиксированные ключевые слова и значения / переменные / параметры. Некоторые ключевые слова являются необязательными, а некоторые являются обязательными и в указанном порядке c. Количество и тип переменных / значений, связанных с данным ключевым словом / следующих за ним, может варьироваться от одного ключевого слова к другому.
РЕШЕНИЕ НА ДРУГОМ ЯЗЫКЕ: я написал обобщенный c код на c ++, который будет анализировать любую строку и преобразовывать входные данные в структурированные данные. Входные данные для кода: 1. строка, которую нужно проанализировать, и 2. модель / структура, описывающая, какие ключевые слова искать, являются ли они необязательными или нет, в каком порядке они могут отображаться и какой тип значений / переменных ожидать для каждого (а также сколько значений / переменных). В c ++ интерфейс позволяет пользователю, помимо прочего, предоставлять набор пользовательских функций обратного вызова (по одной для каждого ключевого слова), которые будут вызываться механизмом синтаксического анализа для предоставления результатов (проанализированные параметры, связанные с данным ключевым словом). Реализация обратного вызова определяется пользователем, но сигнатура обратного вызова предварительно определена.
ЧТО О PYTHON? Я надеюсь на простую библиотеку в python (или в совершенно ином направлении, если это что-то сделано иначе / лучше в python), которая предоставляет интерфейс для указания грамматики / синтаксиса / модели данной строки (подробности всех ключевых слов, их порядка, количества и типа параметров, которые требуются каждому), а затем выполняет синтаксический анализ входных строк на основе этого синтаксиса.
Я не уверен, насколько argparse соответствует тому, что мне нужно, но речь не идет о разборе ввода командной строки, который вы похожи.
ПРИМЕР: Вот пример строки из мира IP-сетей, но проблема более общая c: access-list SOMENAME-IN extended permit tcp host 117.21.212.54 host 174.163.16.23 range 5160 7000
В приведенной выше строке ключевые слова и их соответствующие параметры :
key: extended, no parameters
key: permit, no parameters
key: tcp, no parameters
key: host, par1: 117.21.212.54
key: host, par1: 174.163.16.23
key: range, par1: 5160, par2: 7000
Это форма списка управления доступом межсетевого экрана ACL. В этом случае синтаксический анализатор будет использоваться для заполнения структуры, которая указывает
- the name of the ACL (SOMENAME-IN in the above example)
- the type of ACL (extended in the above example but there are other valid keywords)
- the protocol (tcp in the above example)
- the src host/IP (117.21.212.54 in the example)
- the src port (optional and not present in the above example)
- the dst host/IP (174.163.16.23 in the example)
- the dst port (a range of ports from 5160 to 7000 in the above example)
Можно довольно легко написать выделенный синтаксический анализатор, который принимает приведенный выше пример, задает синтаксис c и проверяет его (возможно, это также может быть более эффективным и более понятным, поскольку нацелен на определенный синтаксис c), но я хочу иметь возможность написать общий код синтаксического анализа, где все ключевые слова и ожидаемый синтаксис предоставляются в виде данных / модели для механизма синтаксического анализа, который использует его для анализа строк, а также может указывать на ошибки в проанализированной строке.
Я, очевидно, не ищу полного решения, потому что это было бы много, но я надеюсь на мысли, в частности, в контексте использования python и повторного использования любых функций или библиотек python, возможно, придется сделать такое разбор.
Спасибо, Ал.