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

Python Regex. Или – простое иллюстрированное руководство

Этот учебник все о или | Оператор библиотеки Python’s Re. Вы также можете воспроизводить видео, пока вы читаете: https://youtu.be/wx9pgvsxqrs Связанная статья: Python Regex SuperPower – Ultimate Guide Python Regex или | Оператор? Учитывая строку. Скажем, ваша цель – найти все подстроки, которые соответствуют либо строке … Python Regex. Или – простой иллюстрированный путеводитель Подробнее »

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

Этот учебник все о или |. Оператор Python’s Re библиотека Отказ Вы также можете играть в урок видео, пока вы читаете:

Связанная статья: Python Regex SuperPower – Ultimate Guide

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

Что такое Python Regex или | Оператор?

Учитывая строку. Скажем, ваша цель – найти все подстроки, которые соответствуют либо Струна «iPhone» или Струна ‘iPad’ . Как вы можете достичь этого?

Самый простой способ достичь этого Python или оператор | Используя шаблон регулярного выражения (iPhone | iPad) .

Вот пример:

>>> import re
>>> text = 'Buy now: iPhone only $399 with free iPad'
>>> re.findall('(iPhone|iPad)', text)
['iPhone', 'iPad']

У вас есть (Saley) текст, который содержит оба строки «iPhone» и «iPad» Отказ

Вы используете метод re.findall (). Если вы этого не знаете, вот определение из статьи блог Finxter:

Метод Re.findall (Pattern, String) находит все вхождения шаблона в строке и возвращает список всех совпадающих подстроек.

Пожалуйста, обратитесь к статью в блоге, чтобы узнать все, что вам нужно знать об этом фундаментальном методе Python.

Первый аргумент – это шаблон (iPhone | iPad) Отказ Это либо соответствует первой части прямо перед ним или символом |. – что это iPhone – Согласовать вторую часть после того, как это iPad Отказ

Второй аргумент – это текст «Купить сейчас: iPhone всего $ 399 с бесплатным iPad ' который вы хотите искать шаблон.

Результат показывает, что в тексте есть два подходящих подстрока: «iPhone» и «iPad» Отказ

Python Regex. Или: Примеры

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

Вы начинаете с предыдущего примера:

>>> import re
>>> text = 'Buy now: iPhone only $399 with free iPad'
>>> re.findall('(iPhone|iPad)', text)
['iPhone', 'iPad']

Что произойдет, если вы не используете скобки?

>>> text = 'iPhone iPhone iPhone iPadiPad'
>>> re.findall('(iPhone|iPad)', text)
['iPhone', 'iPhone', 'iPhone', 'iPad', 'iPad']
>>> re.findall('iPhone|iPad', text)
['iPhone', 'iPhone', 'iPhone', 'iPad', 'iPad']

Во втором примере вы просто пропустили скобки с помощью рисунка Regex iPhone | iPad а не (iPhone | iPad) Отказ Но никаких проблем – это все еще работает и генерирует тот же самый вывод!

Но что произойдет, если вы оставите одну сторону или работу пустые?

>>> re.findall('iPhone|', text)
['iPhone', '', 'iPhone', '', 'iPhone', '', '', '', '', '', '', '', '', '', '']

Выход не так странно, как кажется. Оператор или оператор позволяет для пустых операндов – в этом случае он хочет соответствовать непустой строке. Если это невозможно, он соответствует пустой строке (так что все будет совпадением).

Предыдущий пример также показывает, что он все еще пытается соответствовать непустой строке, если это возможно. Но что, если тривиальное пустое совпадение на левой стороне или операнда?

>>> re.findall('|iPhone', text)
['', 'iPhone', '', '', 'iPhone', '', '', 'iPhone', '', '', '', '', '', '', '', '', '', '']

Это показывает некоторые тонкости двигателя REGEX. Прежде всего, он все еще соответствует непустой строке, если это возможно! Но что более важно, вы можете увидеть, что двигатель Regex соответствует слева направо. Сначала пытается сопоставить левое регулярное выражение (которое он делает на каждом положении в тексте). Пустая строка, которая уже соответствует, больше не будет рассмотрена. Только тогда он пытается сопоставить Regex на правой стороне или оператору.

Подумайте об этом таким образом: двигатель Regex движется слева направо-одному положению одновременно. Это соответствует пустой строке каждый раз. Затем он движется над пустой строкой и в некоторых случаях он все еще может соответствовать непустой строке. Каждый матч «потребляет» подстроку и больше не может быть сопоставлено. Но пустая строка не может быть потреблена. Вот почему вы видите первый матч – это пустая строка, а второй матч – это подстрока «iPhone» Отказ

Как гнездить Python Regex или оператор?

Хорошо, ты не легко доволен, ты? Давайте попробуем вложить Python Regex или оператор |. Отказ

>>> text = 'xxx iii zzz iii ii xxx'
>>> re.findall('xxx|iii|zzz', text)
['xxx', 'iii', 'zzz', 'iii', 'xxx']

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

>>> re.findall('x(i|(zz|ii|(x| )))', text)
[('x', 'x', 'x'), (' ', ' ', ' '), ('x', 'x', 'x')]

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

Python Regex. Или: Класс персонажа

Если вы хотите только сопоставить один символ из набора символов, класс символов гораздо лучший способ сделать это:

>>> import re
>>> text = 'hello world'
>>> re.findall('[abcdefghijklmnopqrstuvwxyz]+', text)
['hello', 'world']

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

>>> re.findall('[a-z]+', text)
['hello', 'world']

Класс персонажа заключен в нотацию кронштейна [] И это буквально означает «совпадение именно один из символов в классе». Таким образом, он несет одинаковую семантику, что и оператор: |. Однако, если вы попытаетесь что-то сделать на этих линиях …

>>> re.findall('(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)+', text)
['o', 'd']

… Вы сначайте напишите гораздо менее лаконичный код и, во-вторых, риск запутаны на выходе. Причина в том, что в скобках является оператор группы – он фиксирует позицию и подстроку, соответствующую Regex. Используется в методе findall (), он возвращает только содержание последней сопоставленной группы. Это оказывается последним характером слова «Привет» и последний символ слова «Мир» Отказ

Как сопоставить или символу (вертикальную линию «|»)?

Так что если персонаж «|» обозначает или Персонаж в данном Regex, возникает вопрос, как сопоставить символ вертикальной линии «|» сам?

Ответ прост: сбежать или символ в вашем регулярном выражении, используя обратную косание. В частности, используйте 'A \ | B' вместо 'A | B' Чтобы соответствовать строке 'A | B' сам. Вот пример:

>>> import re
>>> re.findall('A|B', 'AAAA|BBBB')
['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B']
>>> re.findall('A\|B', 'AAAA|BBBB')
['A|B']

Вы действительно понимаете результаты этого фрагмента кода? В первом примере вы ищете любой символ «А» или характер 'B' Отказ Во втором примере вы ищете строку 'A | B' (который содержит '|' символ).

Python Regex. А также

Если есть Python Regex “или”, также должен быть оператор “и” и “, верно?

Верный! Но подумайте об этом на мгновение: скажем, вы хотите, чтобы одно регельс возникло рядом с другим регелем. Другими словами, вы хотите сопоставить Regex A и Regeex B. Ну так что ты делаешь? Вы соответствуете Regeex ab.

Вы уже видели много примеров «Python Regex и», но вот еще один:

>>> import re
>>> re.findall('AB', 'AAAACAACAABAAAABAAC')
['AB', 'AB']

Простое конкатенация Regex A и B уже выполняет неявное «и операцию».

Python Regex. Нет

Как вы можете искать строку для подстроки, которые не соответствуют данному шаблону? Другими словами, какой «негативный рисунок» в регулярных выражениях Python?

Ответ в два раза:

  • Если вы хотите сопоставить всех персонажей, кроме набора конкретных символов, вы можете использовать отрицательный класс символов [^...] .
  • Если вы хотите сопоставить все подстроки, кроме тех, которые соответствуют шаблону Regex, вы можете использовать функцию Отрицательный вид (?! ...) .

Вот пример для отрицательного класса символов:

>>> import re
>>> re.findall('[^a-m]', 'aaabbbaababmmmnoopmmaa')
['n', 'o', 'o', 'p']

И вот пример для негативного образца Lookahead соответствует всем «словам, которые не за ними»:

>>> re.findall('[a-z]+(?![a-z]+)', 'hello world')
['hello', 'world']

Отрицательный вид (?! [A-Z] +) не потребляет ( совпадение ) любой символ. Это просто проверяет ли шаблон [A-Z] + не совпадает в данной позиции. Единственные времена это происходит, просто перед пустым пространством и концом строки.

[Коллекция] Каковы различные квантификаторы Python Re?

Операторы «и», «или», а «и« не »не являются единственными операторами регулярных выражений, которые вам нужно понять. Так каковы другие операторы?

Далее вы получите быстрый и грязный обзор наиболее важных операций REGEX и как их использовать в Python. Вот самые важные квантификаторы Regex:

Квантификатор Описание Пример
. Wild-Card («DOT») соответствует любому символу в строке, кроме нового символа «N». Regex ‘…’ соответствует всем словам с тремя символами, такими как «abc», «Cat» и «собака».
* Звездочка нулевой или больше соответствует произвольному количеству вхождений (включая нулевые вхождения) непосредственно предшествующего Regex. Regex ‘Cat *’ соответствует строкам «CA», «CAT», «CATT», «CATTT» и «CATTTTTTT».
? Матчи ноль или один (как следует из названия) либо ноль, либо в одних случаях непосредственно предшествующего Regex. Regex ‘Cat?’ Соответствует обеим струнам «Ca» и «CAT» – но не «CATT», «CATTT» и «CATTTTTTT».
+ По меньшей мере, один соответствует одному или нескольким вхождению непосредственно предшествующего регеек. Regex ‘Cat +’ не соответствует строке «CA», а соответствует всем строкам, по меньшей мере, одним задним характером «T», такими как «кошка», «CATT» и «CATTT».
^ Начальная строка соответствует началу строки. Regex ‘^ p’ соответствует строкам «Python» и «программирование», но не «Lisp» и «шпионить», где символ «p» не происходит в начале строки.
$ Конец строки соответствует концу строки. Regex ‘Py $’ будет соответствовать строкам «Main.py» и «Pypy», но не строки «Python» и «pypi».
A | B. Или соответствует либо регезе A или REGEX B. Обратите внимание, что интуиция сильно отличается от стандартной интерпретации или оператора, который также может удовлетворить оба условия. Regex ‘(Hello) | (Привет) «Соответствует строки« Hello World »и« Привет Python ». Было бы не иметь смысла попытаться сопоставить их обоих одновременно.
Аб И совпадает с первым регелем А и второе регулярное выражение в этой последовательности. Мы уже видели его тривиально в Regex ‘Ca’, которое соответствует первым Regex ‘C’ и Second Regex ‘A’.

Обратите внимание, что я дал вышеупомянутые операторы некоторых более значимых имен (жирным шрифтом), чтобы вы могли немедленно понять цель каждого Regex. Например, оператор «^» обычно обозначается как оператор «Caret». Эти имена не описаны Поэтому я придумал более детские сады, такие как оператор «Пусковая строка».

Мы уже видели много примеров, но давайте погрузимся еще больше!

import re

text = '''
    Ha! let me see her: out, alas! he's cold:
    Her blood is settled, and her joints are stiff;
    Life and these lips have long been separated:
    Death lies on her like an untimely frost
    Upon the sweetest flower of all the field.
'''

print(re.findall('.a!', text))
'''
Finds all occurrences of an arbitrary character that is
followed by the character sequence 'a!'.
['Ha!']
'''

print(re.findall('is.*and', text))
'''
Finds all occurrences of the word 'is',
followed by an arbitrary number of characters
and the word 'and'.
['is settled, and']
'''

print(re.findall('her:?', text))
'''
Finds all occurrences of the word 'her',
followed by zero or one occurrences of the colon ':'.
['her:', 'her', 'her']
'''

print(re.findall('her:+', text))
'''
Finds all occurrences of the word 'her',
followed by one or more occurrences of the colon ':'.
['her:']
'''


print(re.findall('^Ha.*', text))
'''
Finds all occurrences where the string starts with
the character sequence 'Ha', followed by an arbitrary
number of characters except for the new-line character. 
Can you figure out why Python doesn't find any?
[]
'''

print(re.findall('n$', text))
'''
Finds all occurrences where the new-line character 'n'
occurs at the end of the string.
['n']
'''

print(re.findall('(Life|Death)', text))
'''
Finds all occurrences of either the word 'Life' or the
word 'Death'.
['Life', 'Death']
'''

В этих примерах вы уже видели специальный символ «\ N», который обозначает нового стилевого символа в Python (и большинство других языках). Есть много специальных символов, специально предназначенных для регулярных выражений. Далее мы обнаружим наиболее важные специальные символы.

Связанные методы Re

Существует семь важных методов регулярного выражения, которые вы должны освоить:

  • Re.findall (шаблон, строка) Метод возвращает список строковых совпадений. Читайте больше в Наше руководство в блоге Отказ
  • Re.Search (шаблон, строка) Метод возвращает объект совпадения первого матча. Читайте больше в Наше руководство в блоге Отказ
  • Re.match (шаблон, строка) Метод Возвращает объект совпадения, если установки Regeex в начале строки. Читайте больше в Наше руководство в блоге Отказ
  • Re.fullmatch (шаблон, строка) Метод возвращает объект совпадения, если Regeex соответствует всей строке. Читайте больше в Наше руководство в блоге Отказ
  • Re.compile (Pattern) Способ подготавливает шаблон регулярной экспрессии – и возвращает объект Regex, который вы можете использовать несколько раз в вашем коде. Читайте больше в Наше руководство в блоге Отказ
  • Re.split (шаблон, строка) Метод возвращает список строк, сопоставив все вхождения шаблона в строке и разделить строку вдоль тех. Читайте больше в Наше руководство в блоге Отказ
  • Re.sub (Re.sub (Pattern, Repl, String ,,) Метод возвращает новую строку, в которой все вхождения шаблона в старой строке заменены на REPL. Читайте больше в Наше руководство в блоге Отказ

Эти семь методов составляют 80% от того, что вам нужно знать, чтобы начать работу с функциональностью регулярных выражений Python.

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

Вы узнали все, что вам нужно знать о Python Regex или Оператор.

Резюме :

Учитывая строку. Скажем, ваша цель – найти все подстроки, которые соответствуют либо Струна «iPhone» или Струна ‘iPad’ . Как вы можете достичь этого?

Самый простой способ достичь этого Python или оператор | Используя шаблон регулярного выражения (iPhone | iPad) .

Хотите заработать деньги, пока вы изучаете Python? Средние программисты Python зарабатывают более 50 долларов в час. Вы, безусловно, можете стать средним, не так ли?

Присоединяйтесь к свободному вебинару, которое показывает, как стать процветающим владельцем бизнеса в Интернете!

[Вебинар] Станьте шестифункциональным внештатным разработчиком с Python

Присоединяйтесь к нам. Это весело! 🙂

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

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

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

Оригинал: “https://blog.finxter.com/python-regex-or/”