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

Python Re Вопросительный знак (?): Дополнительный матч

Поздравляем, вы собираетесь узнать один из самых часто используемых операторов Regex: Quantifier a a? В частности, эта статья все о? Контификатор в библиотеке Python Re. Вы также можете посмотреть видео об объяснении, пока вы снимаете по учебнику:. Если связанная статья: Python Regex SuperPower – Ultimate Guide Что … Python Re Вопросительный знак (?): Дополнительный матч Подробнее »

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

Поздравляем, вы собираетесь изучать один из наиболее часто используемых операторов Regex: Quantifier Mark Rege А? .

В частности, эта статья все о ? Контификатор в Python’s Re библиотека . Вы также можете посмотреть видео объяснения, пока вы снимаете по учебнику:

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

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

Что такое Python Re? Квантификатор

При применении к регулярному выражению А , Питон А? Контификатор соответствует нулю или одному вхождению A . Например, регулярное выражение 'Привет?' соответствует обеим струнам «Он» и «Эй» , но не пустая строка '' Отказ Это потому, что ? Quantifier не распространяется на все Regex «Эй» Но только до предшествующего регеляции 'y' Отказ

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

>>> import re
>>>
>>> re.findall('aa[cde]?', 'aacde aa aadcde')
['aac', 'aa', 'aad']
>>>
>>> re.findall('aa?', 'accccacccac')
['a', 'a', 'a']
>>>
>>> re.findall('[cd]?[cde]?', 'ccc dd ee')
['cc', 'c', '', 'dd', '', 'e', 'e', '']

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

>>> re.findall('aa[cde]?', 'aacde aa aadcde')
['aac', 'aa', 'aad']

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

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

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

Первый аргумент – это шаблон регулярного выражения 'AA [CDE]?' . Второй аргумент – это строка для поиска шаблона. На простом английском, вы хотите найти все шаблоны, которые начинаются с двух «А» Персонажи, а затем один дополнительный персонаж – который может быть либо 'C' , 'D' или 'E' Отказ

findall () Метод Возвращает три подходящих подстроки:

  • Сначала строка «AAC» соответствует шаблону. После того, как Python потребляет соответствующую подстроку, оставшаяся подстрока – 'De Aa Aadcde' Отказ
  • Во-вторых, строка «АА» соответствует шаблону. Python потребляет его, что приводит к оставшейся подстроке «AADCDE» Отказ
  • В-третьих, строка «Аад» соответствует шаблону в оставшейся подстроке. Что остается «CDE» который больше не содержит соответствующую подстроку.

Второй пример следующий:

>>> re.findall('aa?', 'accccacccac')
['a', 'a', 'a']

В этом примере вы смотрите на простой шаблон «АА?» . Вы хотите найти все вхождения символа «А» сопровождается дополнительным вторым «А» Отказ Но имейте в виду, что необязательный второй «А» не нужен для шаблона, чтобы соответствовать.

Следовательно, двигатель Regex находит три матча: персонажи «А» Отказ

Третий пример следующий:

>>> re.findall('[cd]?[cde]?', 'ccc dd ee')
['cc', 'c', '', 'dd', '', 'e', 'e', '']

Это рисунок Regex выглядит сложной: «[CD]? [CDE]? ' . Но это действительно?

Давайте сломаемся пошаговым шагом:

  • Первая часть регеляции [CD]? Определяет Класс персонажа [CD] который читает как “совпадение” либо c или D “. Контификатор вопросительного знака указывает, что вы хотите сопоставить один или нулевые вхождения этого шаблона.
  • Вторая часть регеляции [CDE]? Определяет класс символов [CDE] который читает как “совпадение” либо c , D или е “. Опять же, вопрос вопросительного знака указывает на соответствие нулевой или одному требованию.

Поскольку обе части необязательны, пустая строка соответствует шаблону Regex. Тем не менее, попытки двигателя Python RegeX как можно больше Отказ

Таким образом, двигатель REGEX выполняет следующие шаги:

  • Первый матч в строке «CCC DD EE» это 'cc' Отказ Двигатель Regex потребляет соответствующую подстроку, поэтому строка 'C DD EE' останки.
  • Второй матч в оставшейся строке является символом 'C' Отказ Пустое пространство '' не соответствует регулярному выражению, поэтому вторая часть Regex [CDE] не соответствует. Из-за квантификатора вопросительного знака это нормально для двигателя Regex. Оставшаяся строка 'DD EE' Отказ
  • Третий матч – пустая строка '' Отказ Конечно, Python не пытается соответствовать тому же положению дважды. Таким образом, он движется дальше, чтобы обработать оставшуюся строку 'DD EE' Отказ
  • Четвертый матч – это строка 'dd' Отказ Оставшаяся строка 'EE' Отказ
  • Пятый матч – это строка '' Отказ Оставшаяся строка 'EE' Отказ
  • Шестого матча – это строка 'E' Отказ Оставшаяся строка 'E' Отказ
  • Седьмой матч – это строка 'E' Отказ Оставшаяся строка '' Отказ
  • Восьмой матч – это строка '' Отказ Ничего не остается.

Это было самым сложным для наших примеров. Поздравляю, если вы все это поняли!

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

Марк Quantifier-Python Re ? – только один из многих операторов Regex. Если вы хотите использовать (и понимать) регулярные выражения на практике, вам нужно знать все их сердцем!

Так что давайте погрузимся в других операторах:

Регулярное выражение – это десятилетие – старая концепция в информатике. Придуманы в 1950-х годах знаменитым математиком Стивеном Коуном Клееем, десятилетия эволюции принесли огромное разнообразие операций. Сбор всех операций и записать всеобъемлющий список приведет к самой толстую и нечитаемой книге самостоятельно.

К счастью, вам не нужно изучать все регулярные выражения, прежде чем вы сможете начать использовать их в ваших практических проектах кода. Далее, вы получите быстрый и грязный обзор большинства операций важно регулярных выражений и как использовать их в 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 (и большинство других языках). Есть много специальных символов, специально предназначенных для регулярных выражений. Далее мы обнаружим наиболее важные специальные символы.

В чем разница между Python Re? и * кванты?

Вы можете прочитать Python Re А? квантификатор как Regex Zero или-Onex : предшествующий регенс А соответствует нулевым временам, либо точно один раз. Но это не совсем не совсем не совсем.

Аналогично, вы можете прочитать Python Re A * Оператор как Ноль-или-Многократное Regex (Я знаю, что это звучит немного неулов): предыдущий регеекс А соответствует произвольному количеству раз.

Вот пример, который показывает разницу:

>>> import re
>>> re.findall('ab?', 'abbbbbbb')
['ab']
>>> re.findall('ab*', 'abbbbbbb')
['abbbbbbb']

Regex 'ab?' соответствует персонажу «А» В строке с последующим персонажем 'b' Если он существует (что он делает в коде).

Regex 'ab *' соответствует персонажу «А» В строке, за которым следует столько персонажей 'b' насколько это возможно.

В чем разница между Python Re? и + кванты?

Вы можете прочитать Python Re А? квантификатор как Regex Zero или-Onex : предшествующий регенс А соответствует нулевым временам, либо точно один раз. Но это не совсем не совсем не совсем.

Аналогично, вы можете прочитать Python Re A + Оператор как по крайней мере, когда регельс : Предыдущее Regex A сопоставляется произвольным количеством раз, но, по крайней мере, один раз.

Вот пример, который показывает разницу:

>>> import re
>>> re.findall('ab?', 'aaaaaaaa')
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
>>> re.findall('ab+', 'aaaaaaaa')
[]

Regex 'ab?' соответствует персонажу «А» В строке с последующим персонажем 'b' Если он существует – но он не в коде.

Regex 'ab +' соответствует персонажу «А» В строке, за которым следует столько персонажей 'b' как можно – но хотя бы один. Тем не менее, персонаж 'b' не существует, так что нет совпадения.

Что такое Python Re *?, +? ?? Количественные кванты?

Вы узнали о трех квантах:

  • Квантификатор A * соответствует произвольному количеству шаблонов A .
  • Квантификатор A + соответствует хотя бы одному шаблону A .
  • Квантификатор А? соответствует шаблону нулевой или один A .

Эти три – все жадный : Они соответствуют максимально возможным вхождении шаблона. Вот пример, который показывает свою жадность:

>>> import re
>>> re.findall('a*', 'aaaaaaa')
['aaaaaaa', '']
>>> re.findall('a+', 'aaaaaaa')
['aaaaaaa']
>>> re.findall('a?', 'aaaaaaa')
['a', 'a', 'a', 'a', 'a', 'a', 'a', '']

Код показывает, что все три кванции * , + и ? соответствовать как много «А» персонажи насколько это возможно.

Итак, логический вопрос: как можно сопоставить как можно меньше? Мы называем это не жадный Соответствие. Вы можете добавить знак вопроса после соответствующих количественных квантов, чтобы сообщить двигателю Regex, который вы намереваетесь максимально соответствовать нескольким шаблонам: *? , +? и ?? .

Вот тот же пример, но с не жадными квантами:

>>> import re
>>> re.findall('a*?', 'aaaaaaa')
['', 'a', '', 'a', '', 'a', '', 'a', '', 'a', '', 'a', '', 'a', '']
>>> re.findall('a+?', 'aaaaaaa')
['a', 'a', 'a', 'a', 'a', 'a', 'a']
>>> re.findall('a??', 'aaaaaaa')
['', 'a', '', 'a', '', 'a', '', 'a', '', 'a', '', 'a', '', 'a', '']

В этом случае код показывает, что все три кванции *? , +? и ?? соответствовать как мало «А» персонажи насколько это возможно.

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

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

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

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

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

Вы узнали все, что вам нужно знать о Quantier Mark? В этом руководстве Regex.

Резюме : При применении к регулярному выражению A, Python’s A? Контификатор соответствует нулю или одному вхождению A.? Контификатор всегда применяется только к предыдущему регулярному выражению. Например, регулярное выражение «Эй?» соответствует обеим струнам «он» и «эй». Но это не соответствует пустой строке, потому что? Quantifier не распространяется на все Regex «Эй», но только к предшествующему Regex ‘Y’.

Курс Python Regex

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

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

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

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

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

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

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

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

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

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

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

Оригинал: “https://blog.finxter.com/python-re-question-mark/”