Регулярные выражения: выбирайте текст, который не соответствует заданным критериям.

Вопрос или проблема

У меня есть большой набор данных следующей общей структуры:

[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+
Объяснение
  1. Основные компоненты выражения:

    • \S+ — находит одну или более непробельных символов. Это соответствует части текста, которая потенциально может быть адресом электронной почты.
    • @ — ищет символ @, который присутствует в каждом адресе электронной почты.
    • \S+ — снова находит одну или более непробельных символов, которые могут следовать за @.
    • (*SKIP)(*FAIL) — при совпадении с полным адресом электронной почты, эта конструкция позволяет пропустить этот матч, тем самым избегая его включения в результаты.
  2. Вторичная альтернатива:

    • |\S+ — это часть, которая соответствует любому непробельному тексту. Она активируется в тех случаях, когда предыдущая часть (\S+@\S+(*SKIP)(*FAIL)) не срабатывает, что позволяет получить текст, не являющийся адресом электронной почты.
  3. Флаги:

    • 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) является отличным примером того, как можно игнорировать совпадения, которые нам не нужны, тем самым сосредоточив внимание на релевантной информации.

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

Оцените материал
Добавить комментарий

Капча загружается...