Извлекаем email адреса из текста при помощи Google Sheets или R
Предположим что у вас есть задача извлечь адреса электронных почт из ячеек, в которых кроме имейлов содержится и другая информация в текстовом формате.
Это можно сделать тремя способами:
Руками - мы понятно его рассматривать не будем. Хотя если есть чужие и очень дешевые руки, а также непреодолимое желание почувствовать себя рабовладельцем - то конечно можно. Кто я такой чтобы запрещать?
Через Google Sheets - наиболее оптимальный и с низким порогом вхождения.
Через язык программирования R - тот же результат, но изящнее и проще реализовывается, если необходимо работать с большим количеством однотипных файлов.
Данные для работы
В моем примере есть небольшой файл, который содержит выгрузку аккаунтов из instagram с описанием из шапки профиля(description или biography кто как называет). Из этого поля мы и будем извлекать имейлы.
Небольшой файл с примером доступен по ссылке
Регулярное выражение
Если быть честным, то по сути данный способ подходит для любых языков программирования, потому что в его основе лежит простое регулярное выражение. А уже где вы его будете использовать это вам решать.
Сама регулярка выглядит так:
[A-z0-9._%+-]+@[A-z0-9.-]+\.[A-z]{2,4}
ее мы и будем использовать в обоих случаях
Извлекаем адреса электронных почт при помощи регулярных выражений в Google Sheets
Насколько я знаю, в Microsoft Excel такой возможности "из коробки" нет и там придется извращаться через макросы VBA. Поэтому мы и используем гугл таблицы. Но киньте в меня справочником если я ошибаюсь.
Для этого нам понадобится всего одна функция, которая и сделает всю работу за нас.
REGEXEXTRACT
Формула работает по принципу REGEXEXTRACT(текст; регулярное выражение)
Вписываем формулу в ячейку и вместо парметра "текст" ставим ссылку на нужную нам ячейку таблицы(в примере это ячейка А2). Вторым параметром пишем нашу регулярку(обязательно в кавычках)
Протягиваем по всему столбцу и получаем результат. Как видно, в тех строках, которые не содержат имейлов, формула выдает ошибку. Можно удариться в перфекционизм и добавить другую формулу IFERROR (ЕСЛИОШИБКА) которая заменит стандартный текст ошибки на какой нибудь другой, например "No email"
Конечная формула и результат выглядят так:
ЕСЛИОШИБКА(REGEXEXTRACT(A2;"[A-z0-9._%+-]+@[A-z0-9.-]+\.[A-z]{2,4}");"No email")
Готово! Наш список электронных почт готов. Остается только использовать его в правильных и непротивозаконных целях.
Извлекаем адреса электронных почт при помощи регулярных выражений в R
Здесь логика примерно такая же. Для извлечения текста из строки я буду использовать библиотеку "stringr", а для работы с CSV файлами "vroom". Устанавливаем библиотеки если еще нет и подключаем их
install.packages('stringr') # Установка
install.packages('vroom')
library('stringr') # Подключение
library('vroom')Загрузим CSV файл и преобразуем его в таблицу
our_table <- vroom("{PATH TO FOLDER}\\Filename.csv")Если же у вас много файлов, у которых одинаковая структура, и их надо собрать в одну большую таблицу, то это также можно автоматизировать через R
files <- dir(path = "{PATH TO FOLDER}", pattern = "\\.csv")
our_table <- vroom(files)Для удобства создадим переменную regex в которую запишем уже знакомое нам регулярное выражение. Обратите внимание что в R спецзнаки экранируются через двойной обратный слеш.
regex <-'[A-z0-9\\._%+-]+@[A-z0-9\\.-]+\\.[A-z]{2,4}'Пишем финальную формулу, в которой добавляем в существующую таблицу новый столбец для извлеченных имейлов
our_table$extract_emails <- str_extract(our_table$biography, regex)
Экспортируем получившийся результат в CSV файл
write.csv(our_table,"{PATH TO FOLDER}\\our_table.csv")Для удобства можно отфильтровать таблицу, оставив в ней только те строки, для которых есть извлеченные имейлы.
our_table_fin <- our_table %>%
filter(!is.na(our_table$extract_emails))Конечны скрипт выглядит как-то так
#Устанавливаем и подключаем библиотеки
install.packages('stringr')
install.packages('vroom')
library('stringr')
library('vroom')
#Грузим таблицу из CSV файла
our_table <- vroom("{PATH TO FOLDER}\\Filename.csv")
#Если файлов несколько то собираем их в одну таблицу
files <- dir(path = "{PATH TO FOLDER}", pattern = "\\.csv")
our_table <- vroom(files)
# Пишем регулярку в переменную
regex <-'[A-z0-9\\._%+-]+@[A-z0-9\\.-]+\\.[A-z]{2,4}'
#Добавляем новый столбец в таблицу и одновременно применяем функцию str_extract
#которая достанет нужный текст по паттерну регулярного выражения
our_table$extract_emails <- str_extract(our_table$biography, regex)
# Если нужно то фильтруем таблицу оставив в ней только строки с имейлами
our_table_fin <- our_table %>%
filter(!is.na(our_table$extract_emails))
#выгружаем результат в красивую CSVшку
write.csv(our_table_fin,"{PATH TO FOLDER}\\our_table.csv")Вот и все. Теперь вы умеете извлекать имейлы из текста при помощи гугл таблиц, R и регулярных выражений.