You are currently viewing Сопоставление шаблонов в Python с регулярным выражением

Сопоставление шаблонов в Python с регулярным выражением

Обязательное условие: Регулярные выражения в Python

Возможно, вы знакомы с поиском текста, нажав ctrl-F и введя нужные слова. Регулярные выражения делают еще один шаг вперед: они позволяют указать шаблон текста для поиска.
Регулярные выражения, для краткости называемые регулярными выражениями, являются описаниями шаблона текста. Например, a \d в регулярном выражении обозначает цифровой символ, то есть любое единственное число от 0 до 9.

  • Следующее регулярное выражение используется в Python для сопоставления строки из трех чисел, дефиса, еще трех чисел, еще одного дефиса и четырех чисел.
Любая другая строка не соответствовала бы шаблону.
\d\d\d-\d\d\d-\d\d\d\d
  • Регулярные выражения могут быть гораздо более сложными. Например, добавление 3 в фигурных скобках ({3}) после шаблона-это все равно, что сказать: “ Сопоставьте этот шаблон три раза”. Таким образом, немного более короткое регулярное выражение
\d{3}-\d{3}-\d{4}
  • (Он соответствует правильному формату телефонного номера.)

Создание объекта регулярного выражения

Все функции регулярных выражений в Python находятся в модуле re

import re

Чтобы создать объект регулярного выражения, соответствующий шаблону номера телефона, введите в интерактивную оболочку следующее.

phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

Теперь переменная phoneNumRegex содержит объект регулярного выражения.

Сопоставление объектов регулярных выражений

Метод search() объекта регулярного выражения выполняет поиск в передаваемой строке любых совпадений с регулярным выражением. Объекты сопоставления имеют метод group (), который возвращает фактический сопоставленный текст из строки поиска.

# Python program to illustrate
# Matching regex objects
import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('My number is 415-555-4242.')
print('Phone number found: ' + mo.group())

Выход:

Найденный номер телефона: 415-555-4242

Этапы сопоставления регулярных выражений

Хотя в Python есть несколько шагов для использования регулярных выражений, каждый шаг довольно прост.

  1. Импортируйте модуль регулярных выражений с помощью import re.
  2. Создайте объект регулярного выражения с помощью функции re.compile (). (Не забудьте использовать необработанную строку.)
  3. Передайте строку, которую вы хотите найти, в метод search() объекта регулярного выражения. Это возвращает объект соответствия.
  4. Вызовите метод group() объекта сопоставления, чтобы вернуть строку фактического совпадающего текста.Группировка в круглых скобках

Группировка в круглых скобках

Сопоставление объектов:Допустим, вы хотите отделить код города от остальной части телефонного номера. Добавление круглых скобок создаст группы в регулярном выражении: (\d\d\d)-(\d\d\d-\d\d\d \ d). Затем вы можете использовать метод объекта сопоставления group (), чтобы получить соответствующий текст только из одной группы.

# Python program to illustrate
# Matching regex objects
# with grouping
import re
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
print(mo.group(1))

Выход:

'415'
  1. Извлеките все группы сразу : Если вы хотите получить все группы сразу, используйте метод groups (),—обратите внимание на форму множественного числа для имени.
# Python program to illustrate
# Matching regex objects
# with groups
import re
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
print(mo.groups())

Выход:

('415', '555-4242')
  1. Использование mo.групп : mo.groups() вернет кортеж из нескольких значений, вы можете использовать трюк с множественным назначением, чтобы присвоить каждое значение отдельной переменной, как в следующей строке areaCode, mainNumber = mo.groups ().
# Python program to illustrate
# Matching regex objects
# with mo.groups()
import re
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
areaCode, mainNumber = mo.groups()
print(mainNumber)

Выход:

'555-4242'
  1. Сопоставьте скобки : Круглые скобки имеют особое значение в регулярных выражениях, но что делать, если вам нужно сопоставить круглые скобки в тексте. Например, возможно, телефонные номера, которые вы пытаетесь сопоставить, имеют код города, указанный в круглых скобках. В этом случае вам нужно экранировать символы ( и ) обратной косой чертой. Введите в интерактивную оболочку следующее:
# Python program to illustrate
# Matching regex objects
# with grouping
import re
phoneNumRegex = re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My phone number is (415) 555-4242.')
print(mo.group(1))

Выход:

'(415)'
  1. Escape-символы \( и \) в необработанной строке, переданной в re.compile (), будут соответствовать фактическим символам скобок.

Сопоставление нескольких групп с трубой

Символ | называется каналом. Вы можете использовать его в любом месте, где хотите, чтобы соответствовать одному из многих выражений. Например, регулярное выражение «Батман|Тина Фей» будет соответствовать либо «Бэтмен’, либо «Тина Фей».

Когда и Бэтмен, и Тина Фей встречаются в строке поиска, первое вхождение совпадающего текста будет возвращено в качестве объекта соответствия. Введите в интерактивную оболочку следующее:

# Python program to illustrate
# Matching regex objects
# with multiple Groups with the Pipe
import re
heroRegex = re.compile (r'Batman|Tina Fey')
mo1 = heroRegex.search('Batman and Tina Fey.')
print(mo1.group())

Выход:

'Batman'

Если у вас есть группа, которую вы хотите повторить определенное количество раз, следуйте за группой в вашем регулярном выражении с номером в фигурных скобках. Например, регулярное выражение (Ha){3} будет соответствовать строке «HaHaHa», но оно не будет соответствовать «HaHa», так как последнее имеет только два повторения группы (Ha).

Вместо одного числа вы можете указать диапазон, написав минимум, запятую и максимум между фигурными скобками. Например, регулярное выражение (Ha){3, 5} будет соответствовать ‘HaHaHa», ‘HaHaHa » и «HaHaHaHa».

Вы также можете опустить первое или второе число в фигурных скобках, чтобы оставить минимальное или максимальное значение неограниченным. Например, (Ha){3, } будет соответствовать трем или более экземплярам группы (Ha), в то время как (Ha){, 5} будет соответствовать от нуля до пяти экземпляров. Фигурные скобки могут помочь сделать ваши регулярные выражения короче. Эти два регулярных выражения соответствуют одинаковым шаблонам:

(Ha){3}
(Ha)(Ha)(Ha)

И эти два регулярных выражения также соответствуют одинаковым шаблонам:

(Ha){3, 5}
((Ha)(Ha)(Ha))|((Ha)(Ha)(Ha)(Ha))|((Ha)(Ha)(Ha)(Ha)(Ha))

Введите в интерактивную оболочку следующее:

# Python program to illustrate
# Matching Specific Repetitions
# with Curly Brackets
import re
haRegex = re.compile(r'(Ha){3}')
mo1 = haRegex.search('HaHaHa')
print(mo1.group())

Выход:

'HaHaHa'
# Python program to illustrate
# Matching Specific Repetitions
# with Curly Brackets
import re
haRegex = re.compile(r'(Ha){3}')
mo2 = haRegex.search('Ha')== None
print(mo2)

Выход:

True

Здесь (Ha){3} соответствует ‘HaHaHa», но не «Ha». Поскольку он не совпадает с » Ha’, функция search() не возвращает ничего.

Необязательное совпадение со знаком вопроса

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

# Python program to illustrate
# optional matching
# with question mark(?)
import re
batRegex = re.compile(r'Bat(wo)?man')
mo1 = batRegex.search('The Adventures of Batman')
print(mo1.group())

Выход:

'Batman'
# Python program to illustrate
# optional matching
# with question mark(?)
import re
batRegex = re.compile(r'Bat(wo)?man')
mo2 = batRegex.search('The Adventures of Batwoman')
print(mo2.group())

Выход:

'Batwoman'

(Во)? часть регулярного выражения означает, что шаблон wo является необязательной группой. Регулярное выражение будет соответствовать тексту, в котором содержится ноль экземпляров или один экземпляр wo. Вот почему регулярное выражение соответствует как «Женщина-летучая мышь», так и «Бэтмен».
Вы можете подумать об этом ? как говорится, ”Сопоставьте ноль или одну из групп, предшествующих этому вопросительному знаку».
Если вам нужно сопоставить фактический символ вопросительного знака, экранируйте его с помощью \?.

Сопоставление нуля или более со Звездой

* (называемая звездочкой или звездочкой) означает “совпадение с нулем или более”—группа, предшествующая звезде, может встречаться в тексте любое количество раз. Оно может полностью отсутствовать или повторяться снова и снова. Давайте еще раз рассмотрим пример с Бэтменом.

# Python program to illustrate
# matching a regular expression
# with asterisk(*)
import re
batRegex = re.compile(r'Bat(wo)*man')
mo1 = batRegex.search('The Adventures of Batman')
print(mo1.group())

Выход:

'Batman'
#python program to illustrate
#matching a regular expression
#with asterisk(*)
import re
batRegex = re.compile(r'Bat(wo)*man')
mo2 = batRegex.search('The Adventures of Batwoman')
print(mo2.group())

Выход:

'Batwoman'
# Python program to illustrate
# matching a regular expression
# with asterisk(*)
import re
batRegex = re.compile(r'Bat(wo)*man')
mo3 = batRegex.search('The Adventures of Batwowowowoman')
print(mo3.group())

Выход:

'Batwowowowoman'

Для «Бэтмена» (wo)* часть регулярного выражения соответствует нулю экземпляров wo в строке; для «Женщины-летучей мыши» (wo)* соответствует одному экземпляру wo; а для » Женщины-летучей мыши’ (wo)* соответствует четырем экземплярам wo.

Если вам нужно сопоставить фактический символ звезды, префикс звезды в регулярном выражении с обратной косой чертой, \*.

Сопоставление одного или нескольких с плюсом

В то время как * означает “совпадение с нулем или более», + (или плюс) означает “сопоставьте один или несколько”. В отличие от звезды, которая не требует, чтобы ее группа отображалась в соответствующей строке, группа, предшествующая плюсу, должна появляться по крайней мере один раз. Это не является необязательным. Введите следующее в интерактивную оболочку и сравните его со звездными регулярными выражениями в предыдущем разделе:

# Python program to illustrate
# matching a regular expression
# with plus(+)
import re
batRegex = re.compile(r'Bat(wo)+man')
mo1 = batRegex.search('The Adventures of Batwoman')
print(mo1.group())

Выход:

'Batwoman'
# Python program to illustrate
# matching a regular expression
# with plus(+)
import re
batRegex = re.compile(r'Bat(wo)+man')
mo2 = batRegex.search('The Adventures of Batwowowowoman')
print(mo2.group())

Выход:

'Batwowowowoman'

batRegex = re.compile(r’Bat(wo)+man’)

# Python program to illustrate
# matching a regular expression
# with plus(+)
import re
batRegex = re.compile(r'Bat(wo)+man')
mo3 = batRegex.search('The Adventures of Batman')== None
print(mo3)

Выход:

True

Регулярное выражение Летучая мышь(wo)+человек не будет соответствовать строке «Приключения Бэтмена», потому что по крайней мере один wo требуется для знака плюс.

Если вам нужно сопоставить фактический символ со знаком плюс, поставьте перед знаком плюс обратную косую черту, чтобы избежать его: \+.