Время прочтения: 3 мин.

Довольно часто при работе с данными возникает необходимость быстрого поиска информации по заданному шаблону (поиск необходимого списка, слова, словаря и т.д).

При решении подобного рода задач можно столкнуться с довольно интересной библиотекой — pampy. На официальном репозитории на GitHub описаны наиболее значимые преимущества данной библиотеки – скорость работы, компактность (вся библиотека состоит из всего 150 строк) а также возможность формирования «читаемого» и понятного кода.

После подобного рода описания естественно возникает желание опробовать инструмент «в деле», итак приступим!

Для начала установим данный модуль с помощью команды — pip install pampy. Стоит обратить внимание, что модуль работает только на версиях python >=3.6, это связано с возможностью поиска словарей, которая реализована только в более поздних версиях языка.

Далее импортируем необходимые для работы модули:

from pampy import match, HEAD, TAIL, _
import re
Реализуем простую функцию для поиска определенного рода паттернов:
def search_patterns(obj_):
	return match(obj_,
int, “Обнаружено целое число”,
[1,3, _], “Обнаружен список, начинающийся на числа 1 и 3”),
_, “Ничего не обнаружено”

Запустим нашу тестовую функцию:

Исходя из результата, можно сказать, что программа справилась с поставленной задачей. Но что же еще можно сделать, используя модуль pampy? Обратимся к официальному источнику, содержащему исчерпывающие примеры:

Попробуем с помощью данной библиотеки произвести поиск списка, с интересующей нас структурой. Допустим, все, что мы знаем о списке – его первые два элемента. При обычном подходе в цикле необходимо проверять для каждого списка наличие совпадающих первых значений чисел, что ведет к написанию большого и местами нечитаемого кода. Попробуем решить поставленную задачу с помощью рассматриваемого модуля:

def list_searcher(fn,sn,lst):
return match(lst, [fn,sn,TAIL], True, _, False)
lists = res_lst = [elem for elem in lsts if list_searcher(2,4,elem)]
print(res_lst)

Результат выполнения программы:

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

В ходе обработки больших объёмов данных так же возникала необходимость поиска ФИО или ИНН клиентов в текстах жалоб и обращений. С этой задачей можно справиться, применив следующую функцию:

def search_name_or_inn(string_for_search):
  return match(string_for_search,
               re.compile('([А-ЯЁ][а-яё]+\s+[А-ЯЁ][а-яё]+(?:\s+[А-ЯЁ][а-яё]+)?)'),  lambda fio: fio,
               re.compile('(\d{11})'),  lambda inn: inn,
               strict = False)

Запустим тестовый пример и посмотрим на результат:

Данная библиотека изобилует возможностями по поиску и обработке данных, представленных в различного рода шаблонах, остается только пробовать.