Вопрос или проблема
У меня есть большой набор данных следующей общей структуры:
[email protected] asgasdgasdfas [email protected]
asdfasdfasdf [email protected] [email protected] asdfasdfa
Я хочу выбрать всё, что не является адресом электронной почты. Я знаю, как выбрать адреса электронной почты ([^ ]*@[^ ]*\.[A-Za-z]*)
, но не знаю, как отрицать результат и выбрать всё, кроме адресов электронной почты.
Буду признателен за любую помощь.
Спасибо.
(*SKIP)
и (*FAIL)
— ваши друзья.
Используйте: \S+@\S+(*SKIP)(*FAIL)|\S+
, это соответствует всему, что не является адресом электронной почты.
/
\S+@\S+(*SKIP)(*FAIL)|\S+
/
gm
1-я альтернатива \S+@\S+(*SKIP)(*FAIL)
\S соответствует любому символу, не являющемуся пробелом (эквивалентно [^\r\n\t\f\v ])
+ соответствует предыдущему токену от одного до неограниченного числа раз, сколько угодно раз, возвращая по мере необходимости (жадный)
@ соответствует символу @ с индексом 6410 (4016 или 1008) в прямом смысле (учитывая регистр)
\S соответствует любому символу, не являющемуся пробелом (эквивалентно [^\r\n\t\f\v ])
+ соответствует предыдущему токену от одного до неограниченного числа раз, сколько угодно раз, возвращая по мере необходимости (жадный)
(*SKIP) действует как (*PRUNE), за исключением того, что если шаблон не привязан, сдвиг вперед не переходит к следующему символу, а к позиции в тексте, где было встречено (*SKIP)
(*FAIL) — глагол, синонимичный (?!). Принуждает к неудаче соответствия в данной позиции в шаблоне
2-я альтернатива \S+
\S соответствует любому символу, не являющемуся пробелом (эквивалентно [^\r\n\t\f\v ])
+ соответствует предыдущему токену от одного до неограниченного числа раз, сколько угодно раз, возвращая по мере необходимости (жадный)
Глобальные флаги шаблона
g модификатор: глобальный. Все совпадения (не возвращается после первого совпадения)
m модификатор: многострочный. Заставляет ^ и $ соответствовать началу/концу каждой строки (а не только началу/концу строки)
Ответ или решение
Как выбрать текст, который не соответствует заданным критериям с помощью регулярных выражений (Regex)
Регулярные выражения (Regex) представляют собой мощный инструмент для анализа и обработки текстов. В данном случае мы столкнулись с задачей выбора всех текстовых фрагментов, которые не являются адресами электронной почты из данных, содержащих почтовые адреса. Для этого нам понадобятся некоторые особые функции и конструкции регулярных выражений.
Задача
Имея следующий текст, содержащий адреса электронной почты:
<a href="https://superuser.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fc9f938e92bc959f938c959dd29f9391">[email protected]</a> asgasdgasdfas <a href="https://superuser.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dfabbabb9fabb0bbbbf1bcb0b2">[email protected]</a>
asdfasdfasdf <a href="https://superuser.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d8beaabdbc98acb9b1b4f6b6bdacf6bdbc">[email protected]</a> <a href="https://superuser.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aec6c1c3cbdceec7c2c2c7cfca80cdc1c3">[email protected]</a> asdfasdfa
Ваша цель состоит в том, чтобы извлечь текст, который не является электронными адресами.
Решение
Для выполнения этой задачи мы можем использовать следующее регулярное выражение на основе конструкций (*SKIP)
и (*FAIL)
:
\S+@\S+(*SKIP)(*FAIL)|\S+
Объяснение
-
Основные компоненты выражения:
\S+
— находит одну или более непробельных символов. Это соответствует части текста, которая потенциально может быть адресом электронной почты.@
— ищет символ@
, который присутствует в каждом адресе электронной почты.\S+
— снова находит одну или более непробельных символов, которые могут следовать за@
.(*SKIP)(*FAIL)
— при совпадении с полным адресом электронной почты, эта конструкция позволяет пропустить этот матч, тем самым избегая его включения в результаты.
-
Вторичная альтернатива:
|\S+
— это часть, которая соответствует любому непробельному тексту. Она активируется в тех случаях, когда предыдущая часть (\S+@\S+(*SKIP)(*FAIL)
) не срабатывает, что позволяет получить текст, не являющийся адресом электронной почты.
-
Флаги:
g
(глобальный) — позволяет находить все совпадения в строке, а не только первое.m
(многострочный) — позволяет обрабатывать текст с несколькими строками, где^
и$
будут соответствовать началу и концу каждой строки.
Применение
Это регулярное выражение можно использовать в различных языках программирования, поддерживающих Regex, включая Python, JavaScript и другие. Например:
import re
text = """
<a href="https://superuser.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fc9f938e92bc959f938c959dd29f9391">[email protected]</a> asgasdgasdfas <a href="https://superuser.com/cdn-cgi/l/email-protection" ...
"""
non_email_matches = re.findall(r"\S+@\S+(*SKIP)(*FAIL)|\S+", text)
print(non_email_matches)
Заключение
Использование регулярных выражений для выбора текста, который не соответствует заранее заданным критериям, позволяет эффективно обрабатывать и анализировать большие объемы данных. Конструкция (*SKIP)(*FAIL)
является отличным примером того, как можно игнорировать совпадения, которые нам не нужны, тем самым сосредоточив внимание на релевантной информации.
Этот подход не только решает вашу задачу, но и демонстрирует гибкость и мощь регулярных выражений в работе с текстами в целом.