Рубрики
Без рубрики

Как найти все строки, не содержащие Regex в Python?

Сегодня я наткнулся на эту прекрасную проблему Regex: Дано – это многострочная строка и рисунок Regex. Как найти все строки, которые не содержат рисунка Regex? Я дам вам короткий ответ и длительный ответ. Краткий ответ – использовать шаблон ‘((?! Regex).) * Сопоставить все строки, которые не … Как найти все строки, не содержащие Regex в Python? Подробнее “

Автор оригинала: Chris.

Сегодня я наткнулся на эту прекрасную проблему Regex:

Дано – это многострочная строка и рисунок Regex. Как найти все строки, которые не содержат рисунка Regex?

Я дам вам короткий ответ и длительный ответ.

Краткий ответ – использовать шаблон ‘((?! Regex).) * ‘ Чтобы соответствовать всем строкам, которые не содержат рисунка Regex regex. . Выражение ‘ (? ! … ) ‘ негативно выглядит, который гарантирует, что Закрытый рисунок … не следует из текущей позиции.

Итак, давайте обсудим это решение более подробно. (Вы также можете посмотреть мое видео объяснение, если вы предпочитаете видео формат.)

Связанная статья:

  • Python Regex SuperPower – Ultimate Guide

Вы хотите освоить сверхдержаву Regeex? Проверьте мою новую книгу Самый умный способ изучать регулярные выражения в Python С инновационным 3-ступенчатым подходом для активного обучения: (1) Изучение книги главы, (2) Решите головоломки кода и (3) Смотреть воспроизведение главы видео.

Подробный пример

Давайте рассмотрим практический фрагмент кода. Я буду показывать вам код сначала и объяснить его потом:

import re
s = '''the answer is 42
the answer: 42
42 is the answer
43 is not
the answer
42'''

for match in re.finditer('^((?!42).)*$', s, flags=re.M):
    print(match)

	
'''


'''

Вы можете увидеть, что код успешно соответствует только линиям, которые не содержат строки '42' Отказ

Как вы можете сделать это?

Общая идея состоит в том, чтобы соответствовать строке, которая не содержит строку « 42 ' Распечатайте его в оболочку и переходите к следующей строке.

Re.finditer (шаблон, строка) Добивается этого легко, возвращая итератор на все объекты матча.

Рисунок Regex '^ ((?! 42).) * $' соответствует всей линии от первой позиции '^' до последней позиции '$' Отказ Если вам нужен переподготовка к началу линии и Концевые метасимволы, прочитайте это 5-минутное руководство Отказ

Между ними вы соответствуете произвольному количеству персонажей: Quantifier Asterisk делает это для вас. Если вам нужна помощь в понимании квантификатора Asterisk, ознакомьтесь с этим руководством блога.

Какие персонажи вы соответствуете? Только те, где у вас нет негативного слова '42' в вашем поиске. Если вам нужен переподготовка к Lookaheads, проверьте этот урок.

Сама полей не потребляет персонажа. Таким образом, вам нужно потреблять его вручную, добавив точку Metacharacter . который соответствует всем персонажам, кроме символа Newline '\ N' Отказ Как оказывается, есть также учебник блога на точечном метачарам.

Наконец, вам нужно определить решающее значение Многоровный Флаг, Короче говоря: решающее значение М потому что это позволяет начать ^ и конец $ Метамарэрэртечники соответствуют также в начале и конце каждой строки (не только в начале и конце каждой строки). Вы можете узнать больше о аргументе флагов в этом руководстве в блоге.

Вместе это регулярное выражение соответствует всем линиям, которые не содержат конкретного слова '42' Отказ

Если у вас были некоторые проблемы, понимая концепцию Lookahead (и почему она ничего не потребляет), посмотрите на это объяснение из учебного пособия по сопоставлению в этом блоге:

Положительный lookahead (? = …)

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

Но первые вещи первыми: Как работает Ahead Assertion?

В нормальной обработке регулярных выражений, регулярное выражение сопоставляется слева направо. Двигатель Regex «потребляет» частично соответствующие подстроки. Потребляемая подстрока не может быть сопоставлена любой другой частью Regex.

Рисунок: Простой пример lookahead. Регулярный механизм экспрессии соответствует («потребляет») строку частично. Затем он проверяет, может ли оставшийся шаблон быть сопоставлен без надобрения его.

Думайте о утверждении Lookahead в качестве непоглощающего списка шаблонов. Двигатель REGEX идет слева направо – поиск шаблона. В каждой точке он имеет одну «текущую» положение для проверки, является ли эта позиция первой позиции оставшегося совпадения. Другими словами, двигатель REGEX пытается «потреблять» следующий символ как (частичное) совпадение шаблона.

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

Положительный пример Lookahead: Как сопоставить два слова в произвольном порядке?

Что если вы хотите найти данный текст для шаблона A и Pattern B-но ни в одном порядке? Если оба шаблона появляются в любом месте строки, вся строка должна быть возвращена в виде совпадения.

Теперь это немного сложнее, потому что любая шаблон регулярных выражений заказывается слева направо. Простое решение состоит в том, чтобы использовать Ahead Assertion (?. * A) Чтобы проверить, появится ли Regeex A в любой точке строки. (Обратите внимание, что мы принимаем одну строку строки как. * Pattern не соответствует новинному символу по умолчанию.)

Давайте сначала посмотрим на минимальное решение для проверки двух шаблонов в любой точке строки (скажем, шаблоны «Привет» и «вы»).

>>> import re
>>> pattern = '(?=.*hi)(?=.*you)'
>>> re.findall(pattern, 'hi how are yo?')
[]
>>> re.findall(pattern, 'hi how are you?')
['']

В первом примере оба слова не появляются. Во втором примере они делают.

Давайте вернемся к выражению (? =. * Привет) (? =. * Вы), чтобы сопоставить строки, которые содержат как «HI», так и «вы». Почему это работает?

Причина в том, что выражения Lookahead не потребляют ничего. Вы сначала поищите произвольное количество персонажей. *, а затем слово привет. Но потому что двигатель Regex ничего не потреблял, это все еще в То же самое положение в начале строки Отказ Итак, вы можете повторить то же самое для этого слова.

Обратите внимание, что этот метод не заботится о порядке двух слов:

>>> import re
>>> pattern = '(?=.*hi)(?=.*you)'
>>> re.findall(pattern, 'hi how are you?')
['']
>>> re.findall(pattern, 'you are how? hi!')
['']

Независимо от того, какое слово «HI» или «Вы» появляются первым в тексте, двигатель Regex находит обоими.

Вы можете спросить: почему вывод пустой строки? Причина в том, что двигатель Regex не употреблял какой-либо характер. Он только что проверил поиск. Таким образом, простое решение – потреблять всех символов следующим образом:

>>> import re
>>> pattern = '(?=.*hi)(?=.*you).*'
>>> re.findall(pattern, 'you fly high')
['you fly high']

Теперь вся строка – это матч, потому что после проверки поиска leyahead ‘(? =. * Hi) (? =. * Вы)’, вы также употребляете всю строку ». *’.

Отрицательный oshead (?! …)

Отрицательный Lookaead работает так же, как положительный поиск, только проверяет, что данный рисунок Regex делает не происходят вперед из определенной позиции.

Вот пример:

>>> import re
>>> re.search('(?!.*hi.*)', 'hi say hi?')

Отрицательный образец Lookahead (?! .*Привет. *) гарантирует, что, идя вперед в строке, нет возникновения подстроки «Привет» Отказ Первая позиция, где это удерживает, это позиция 8 (сразу после второго 'h' ). Как и положительный поиск, негативное lookahead не потребляет любой символ, поэтому результат – пустая строка (которая является действительным совпадением шаблона).

Вы даже можете объединить несколько негативных Lookaeads, как это:

>>> re.search('(?!.*hi.*)(?!\?).', 'hi say hi?')

Вы ищете должность, где ни один «HI» не находится в Lookahead, и не подходит ли персонаж вопросительного знака немедленно. На этот раз мы потребляем произвольный характер, поэтому полученный матч является характером 'i' .

Куда пойти отсюда?

Резюме : Вы узнали, что вы можете сопоставить все строки, которые не соответствуют определенным Regex Используя шаблон lookahead ((?! Regex).) * .

Курс Python Regex

Инженеры Google являются регулярными мастерами. Система поисковой системы Google – это массивная Текстово-обработка двигателя Это извлекает значение из триллионов веб-страниц.

Инженеры Facebook являются регулярными мастерами экспрессии. Социальные сети, такие как Facebook, WhatsApp, и Instagram Подключите людей через Текстовые сообщения Отказ

Инженеры Amazon являются регулярными мастерами экспрессии. Ecommerce Giants корабля продуктов на основе Описания текстовых продуктов Отказ Регулярные выражения правит игре, когда текстовая обработка соответствует информатике.

Если вы тоже хотите стать регулярным мастером выражения, проверьте Самый полный курс Python Regex на планете:

Сейчас это было много теории! Давайте получим некоторую практику.

В моем Python Freelancer Bootcamp, я буду тренировать вас, как создать себе новый навык успеха в качестве фрилансера Python с потенциалом зарабатывания шести фигур онлайн. Следующая рецессия идет наверняка, и вы хотите, чтобы иметь возможность создать свою собственную экономику, чтобы вы могли позаботиться о своих близких.

Проверьте мой бесплатный «Python Freelancer» Webinar сейчас!

Присоединяйтесь к 20 000 амбициозных кодеров бесплатно!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.

Оригинал: “https://blog.finxter.com/how-to-find-all-lines-not-containing-a-regex-in-python/”