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

Как сопоставить точное слово в Python Regex? (Ответ: не)

Этим утром я прочитал на фактической кворам с этим точным вопросом. В то время как нет тупого вопроса, вопрос раскрывает, что в понимании оснований в библиотеке регулярных выраженных основу в Библиотеке регулярных выражений Python и Python. Так что, если вы нетерпеливый человек, вот краткий ответ: как сопоставить точное слово / строку, используя … Как сопоставить точное слово в Python Regex? (Ответ: не) Подробнее »

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

Этим утром я прочитал на самом деле Квора Нить с этим точным вопросом. В то время как нет тупого вопроса, вопрос показывает, что может быть какой-то разрыв в понимании оснований в Python и Python’s Библиотека регулярных выражений

Так что, если вы нетерпеливый человек, вот короткий ответ:

Как сопоставить точное слово/строку, используя регулярное выражение в Python?

Ты не! Ну, вы можете сделать это, используя простое Regex ‘Привет’ соответствовать этому в ‘Привет мир’ Отказ Но нет необходимости использовать дорогостоящее и менее читаемое регулярное выражение, чтобы соответствовать точной подстроке в данной строке. Вместо этого просто используйте чистое выражение Python ‘Привет’ в ‘Привет мир’ .

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

(Вы также можете посмотреть мое учебное видео, когда вы пройдете на статью.)

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

  • Python Regex SuperPower – Ultimate Guide

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

Как проверить членство слова в строке (Python встроенный)?

Это простой ответ, вы уже узнали. Вместо того, чтобы соответствовать точной строке, это часто достаточно использовать Python’s в Ключевое слово для проверки членства. Поскольку это очень эффективная встроенная функциональность в Python, это намного быстрее, более читаемое и не требует внешних зависимостей.

Таким образом, вы должны положиться на этот метод, если это возможно:

>>> 'hello' in 'hello world'
True

Первый пример показывает самый простой способ сделать это: просто спросите Python, будь то строка «в другой строке». Это называется Оператор членства И это очень эффективно.

Вы также можете проверить, делает ли строка не происходят в другой строке. Вот как:

>>> 'hi' not in 'hello world'
True

Оператор отрицательного членства S1 не в S2 Возвращает Правда Если строка S1 не происходит в строке S2 Отказ

Но есть проблема с оператором членства. Возвращаемое значение – это только логическое значение. Однако преимущество Python’s Библиотека регулярных выражений Re Это возвращает Матч объект который содержит более интересную информацию, такую как точное расположение соответствующей подстроки.

Итак, давайте рассмотрим проблему точного сопоставления строки с использованием библиотеки Regex Next:

Как сопоставить точную строку (Regex)?

Вот как вы можете сопоставить точную подстроку в данной строке:

>>> import re
>>> re.search('hello', 'hello world')

После импорта библиотеки Python для обработки регулярных выражений Re , вы используете Re.Search (шаблон, строка) Способ найти первое возникновение шаблон В строка Отказ Если вы не уверены в этом методе, проверьте мой Подробное руководство в этом блоге.

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

Но подождите, есть еще одна проблема: вы хотели точное совпадение, верно? Но это также означает, что вы получаете префикс сопоставления вашего поиска Word:

>>> re.search('good', 'goodbye')

При поиске точного слова «Хорошо» В строке «Прощай» Это на самом деле соответствует префиксу слова. Это то, что вы хотели?

Если нет, читайте дальше:

Как сопоставить слово в строке (слово границы \ b)?

Итак, как мы можем решить проблему, что точное совпадение словом также будет получать соответствующие подстроки, которые происходят в любой точке строки?

Вот пример:

>>> 'no' in 'nobody knows'
True

И еще один пример:

>>> re.search('see', 'dfjkyldsssseels')

Что, если вы хотите подобрать только целые слова – не точные подстроки? Ответ прост: используйте слово границы Metacharacter '\ B' Отказ Этот метачаренок совпадает с началом и концом каждого слова – но он ничего не потребляет. Другими словами, он просто проверяет, начинается ли слово или заканчивается в этой позиции (путем проверки пробелов или символов без слова).

Вот как вы используете граничный символ слова, чтобы убедиться, что только целые слова совпадают:

>>> import re
>>> re.search(r'\bno\b', 'nobody knows')
>>> 
>>> re.search(r'\bno\b', 'nobody knows nothing - no?')

В обоих примерах вы используете одно и то же Regex '\ bno \ b' что ищет точное слово «Нет» Но только если слово границы символа '\ B' совпадает до и после. Другими словами, слово «Нет» должен появиться самостоятельно как отдельное слово. Не разрешено появляться в другой последовательности символов слова.

В результате Regex не совпадает в строке «Никто не знает» Но это соответствует строке «Никто ничего не знает - нет?» Отказ

Обратите внимание, что мы используем сырую строку R '...' Чтобы написать регулярное выражение, чтобы побегнуть последовательность '\ B' работает в строке. Без сырой струны Python предположил бы, что это неизмеренная обратная косая черта '\' следуют персонаж 'b' Отказ С сырой строкой все обратные косания будут просто так: обратные косание. Затем двигатель REGEX затем интерпретирует два символа в виде одного специального Metacharacter: граница слова '\ B' Отказ

Но что, если вам все равно, является ли слово верхним или строчным или заглавным? Другими словами:

Как сопоставить слово в строке (нечувствителен к регистру)?

Вы можете искать точное слово в строке – но игнорируйте капитализацию. Таким образом, это будет неактуально, являются ли символы слова строчными или прописными буквами. Вот как:

>>> import re
>>> re.search('no', 'NONONON', flags=re.IGNORECASE)

>>> re.search('no', 'NONONON', flags=re.I)

>>> re.search('(?i)no', 'NONONON')

Все три способа эквивалентны: все они игнорируют капитализацию букв слова. Если вам нужно узнать больше о Флаги Аргумент в Python, проверьте мой Подробное руководство по этому блогу Отказ Третий пример использует флаг In-Regex (? я) Это также означает: «игнорировать капитализацию».

Как найти все вхождения слова в строке?

Хорошо, ты никогда не доволен, ты? Итак, давайте рассмотрим, как вы можете найти все вхождения слова в строке.

В предыдущих примерах вы использовали Re.Search (шаблон, строка) Способ найти первый матч шаблон В строка Отказ

Далее вы узнаете, как найти все вхождения (не только первый матч), используя Re.findall (шаблон, строка) метод. Вы также можете прочитать мой Учебник в блоге о методе findall () Это объясняет все детали.

>>> import re
>>> re.findall('no', 'nononono')
['no', 'no', 'no', 'no']

Ваш код извлекает все соответствующие подстроки. Если вам нужно найти все объекты сопоставления, а не подходящие подстроки, вы можете использовать метод Re.finditer (Pattern, Strattion):

>>> for match in re.finditer('no', 'nonononono'):
	print(match)

	





>>> 

Re.finditer (шаблон, строка) Метод создает итератор, который итерации по всем спичкам и возвращает объекты совпадения. Таким образом, вы можете найти все спички и получить также объекты совпадения.

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

Скажем, вы хотите найти все строки, которые содержат слово «42» из многострочной строки в Python. Как ты это сделал?

Ответ использует отличную специальность Python Regex: точечное REGEX соответствует всем персонажам, кроме символа Newline. Таким образом, регельс . * будет соответствовать всем персонажам в данной строке (но затем остановиться).

Вот как вы можете использовать этот факт, чтобы получить все строки, которые содержат определенное слово:

>>> import re
>>> s = '''the answer is 42
the answer: 42
42 is the answer
43 is not'''
>>> re.findall('.*42.*', s)
['the answer is 42', 'the answer: 42', '42 is the answer']

Три из четырех строк содержат слово '42' Отказ findall () Метод возвращает их как строки.

Как найти все строки, не содержащие точного слова?

В предыдущем разделе вы узнали, как найти все строки, которые содержат точное слово. В этом разделе вы узнаете, как сделать противоположное: найдите все строки, которые не содержат точного слова.

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

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, проверьте этот урок.

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

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

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

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

Резюме : Вы изучили несколько способов соответствия точного слова в строке. Вы можете использовать простой оператор членства Python. Вы можете использовать Regex по умолчанию без специальных метасимволов. Вы можете использовать слово границу Metacharacter '\ B' соответствовать только целым словам. Вы можете соответствовать нечувствительному случаю регистра, используя аргумент флагов Re.ignoRecase Отказ Вы можете соответствовать не только одному, но все вхождению слова в строке, используя Re.findall () или Re.finditer () методы. И вы можете сопоставить все строки, содержащие и не содержащие определенного слова.

Steww. Это было некоторые теоретические вещи. Вы чувствуете, что вам нужны более практичные вещи рядом?

Затем ознакомьтесь с My Tracty-Heavy Python Freelancer Course, который помогает вам подготовиться к худшему и создать второй поток дохода, создавая процветающий кодирующий боковой бизнес онлайн.

Become Python Freelancer Course

Курс Python Regex

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

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

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

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

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

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

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