Задача описанной ниже программы такова:
- Получить текст из буфера обмена.
- Найти в нём все телефонные номера и e-mail.
- Полученные данные добавить в буфер обмена и вывести на экран.
Для примера, с помощью горячих клавиш Ctrl+A и Ctrl+C мы можем скопировать весь текст веб-страницы, после чего запустить программу и выгрузить результат в виде списка обнаруженных телефонных номеров и адресов электронных ящиков.
Для выполнения нам понадобятся два модуля:
- re - для работы с регулярными выражениями.
- pyperclip - для работы с функциями копирования и вставки строк.
Теперь следует написать два регулярных выражения, то есть два шаблона искомого текста. Первый шаблон для поиска телефонных номеров, а второй для электронных почтовых ящиков.
Компилируем в переменную phone с помощью функции compile() модуля re шаблон регулярного выражения, как показано ниже.
Если вы не знакомы с регулярными выражениями, эта часть кода может показаться абра-кадабой, поэтому разберу её. Во-первых, сам шаблон номера я составил так, чтобы он искал номера следующих видов: +7 (831) 467-10-01 или 88005551111. То есть он ищет городские номера и коммерческие 8800. Во вторых, весь этот поток сознания можно было записать одной строкой, но для удобочитаемости каждый искомый блок символов я поместил на отдельную строку, используя тройные кавычки и специальный аргумент. А теперь построчно:
- r перед кавычками означает, что последующая строка будет необработанной (сырой) и всякое там экранирование будет игнорироваться.
- (\s|-|\.)* - первый символ искомой строки может содержать пробельный символ (\s), или (|) дефис (-) или (|) любой символ кроме символа новой строки (\.). А * после скобок означает, что таких символов может быть нулевое или произвольное количество. Посмотрите эту подсказку с полным перечнем элементов регулярных выражений. Такая комбинация необходима, так как на многих сайтах перед номером телефона могут быть пробелы, знаки, да и просто номер может начинаться со знака '+'.
- (\d) - искомый блок должен содержать одиночный цифровой символ.
- (\s|-|\.)? - блок аналогичен первому, так как после первой восьмерки часто ставят дефисы или пробелы, но теперь в одном или вообще нулевом экземпляре, поэтому после скобок стоит знак ? (см. подсказку).
- (\d{3}|\(\d{3}\)) - искомый блок символов может содержать три цифровых символа или три цифровых символа в скобках.
- (\s|-|\.)? - смотри пункт три.
- (\d{3}) - блок должен содержать три цифровых символа.
- (\s|-|\.)? - смотри пункт три.
- (\d{4}|\d{2}) - блок должен содержать четыре или два цифровых символа.
- (\s|-|\.)? - смотри пункт три.
- (\d{2})? - блок должен содержать два цифровых символа в нулевом или одном экземпляре. Т.е. этот блок необязателен, если последним цифровым блоком были четыре цифры (+7 (831) 467-1001).
- (\s*(доб|доб.)\s*(\d{2,5}))? - а это необязательный добавочный номер. Он может состоять из произвольного количества пробелов, за которыми следует буквенное обозначение 'доб' или 'доб.' и сам номер, содержащий от двух до пяти цифр.
- Завершает эту красоту аргумент re.VERBOSE. Этот дружок позволяет визуально разделить нашу запутанную конструкцию (что мы сделали разбив на блоки) и даже добавлять к каждой строке комментарии, игнорируя пустое пространство.
Далее напишем шаблон для поиска e-mail адресов.
Он значительно короче и понятнее предыдущего. Его подробно разбирать не буду, если возникнут вопросы, смотрите шпаргалку.
Теперь необходимо создать переменную text, которая будет ссылаться на строковое значение, полученное из буфера обмена. Т.е. на весь скопированный нами со страницы спам. А так же создать пустой список, куда будет добавляться отфильтрованная из спама по нашим шаблонам информация. Назовём его list.
Следующим делом у нас отработает цикл for, который с помощью метода findall по шаблону phone переберет содержимое text в group. В переменную phoneNums попадет перебранная информация, но в отформатированном виде для удобочитаемости (добавятся дефисы между блоками). И если будет присутствовать добавочный номер, он тоже попадет в phoneNums. И уже после этого всё содержимое phoneNums будет добавлено в список list. Аналогичный цикл, только проще, добавит в список все найденные адреса электронных ящиков.
Ну и последним делом программа проверит, не пустой ли наш список, после чего, либо скопирует его в буфер и выведет на экран, либо выведет сообщение, что ничего не обнаружено.
Файл с программой будет ждать в телеграм-канале. Можете доработать его, например добавив форму поиска мобильных номеров, или еще чего. А пример работы программы смотрите на гифке ниже.