Регулярні вирази в Python

 9253

Регулярні вирази в Python (скор. “RegEx” від англ. Regular Expression”) — це послідовність символів, які визначають шаблон для пошуку відповідностей. Наприклад:

Цей код визначає шаблон регулярного виразу, який відповідає будь-якому рядку з 5 букв, що починається на a, та закінчується на s.

Шаблон, визначений за допомогою регулярного виразу, може бути використаний для знаходження відповідностей у рядках.

Шаблон Рядок Відповідає?
^a…s$ abs Немає відповідностей.
alias 1 відповідність.
abyss 1 відповідність.
Alias Немає відповідностей.
An abacus Немає відповідностей.

Python має модуль re для роботи з регулярними виразами. Наприклад:

Тут ми використали метод re.matches() для пошуку відповідностей шаблону регулярного виразу pattern у рядку test_string. Метод повертає відповідний об’єкт, якщо пошук успішний. Якщо ні, повертається None.

Написання регулярних виразів у Python

Для написання регулярних виразів використовуються метасимволи. У прикладі вище ^ та $ — це метасимволи.

Метасимволи — це символи, що інтерпретуються особливим чином у механізмі регулярного виразу. Список метасимволів у Python: [] . ^ $ * + ? {} () \ |.

Метасимвол [] (квадратні дужки)

Квадратні дужки [] визначають набір символів для пошуку відповідності.

Шаблон Рядок Відповідає?
[abc] a 1 відповідність.
ac 2 відповідності.
Hey Jude Немає відповідностей.
abc de ca 5 відповідностей.

Тут [abc] буде відповідати рядку, який містить a, b або c.

Ми також можемо визначити діапазон символів, використовуючи - всередині квадратних дужок, наприклад:

   [a-e] те саме, що [abcde];

   [1-4] те саме, що [1234];

   [0-39] те саме, що [01239].

Ми також можемо інвертувати набір символів, використовуючи ^ після відкриття квадратної дужки, наприклад:

   [^abc] — означає будь-який символ, окрім a або b або c;

   [^0-9] — означає будь-який символ, який не є цифрою.

Метасимвол . (крапка)

Крапка . відповідає будь-якому одинарному символу (крім символу нового рядка '\n').

Шаблон Рядок Відповідає?
.. a Немає відповідностей.
ac 1 відповідність.
acd 1 відповідність.
acde 2 відповідності (2 пари по 2 символи).

Метасимвол ^ (карет)

Символ карет ^ використовується для перевірки того, чи починається рядок з певного символу.

Шаблон Рядок Відповідає?
^a a 1 відповідність.
abc 1 відповідність.
bac Немає відповідностей.
^ab abc 1 відповідність.
acb Немає відповідностей (починається з a, за якою не слідує b).

Метасимвол $ (знак долара)

Знак долара $ використовується для перевірки того, чи закінчується рядок певним символом.

Шаблон Рядок Відповідає?
a$ a 1 відповідність.
formula 1 відповідність.
cub Немає відповідностей.

Метасимвол * (зірочка)

Символ * відповідає нулю або більше входжень решти шаблона.

Шаблон Рядок Відповідає?
ma*n mn 1 відповідність.
man 1 відповідність.
maaan 1 відповідність.
main Немає відповідностей (за a не слідує n).
woman 1 відповідність.

Метасимвол + (плюс)

Символ + відповідає одному або більше входженням решти шаблона.

Шаблон Рядок Відповідає?
ma+n mn Немає відповідностей (немає літери а).
man 1 відповідність.
maaan 1 відповідність.
main Немає відповідностей (за a не слідує n).
woman 1 відповідність.

Метасимвол ? (знак питання)

Знак питання ? відповідає нулю або одному входженню решти шаблона.

Шаблон Рядок Відповідає?
ma?n mn 1 відповідність.
man 1 відповідність.
maaan Немає відповідностей (більше однієї літери a).
main Немає відповідностей (за a не слідує n).
woman 1 відповідність.

Метасимвол {} (фігурні дужки)

Розглянемо наступний шаблон: {n,m}. Це означає діапазон — як мінімум n і як максимум m повторень шаблону.

Шаблон Рядок Відповідає?
a{2,3} abc dat Немає відповідностей.
abc daat 1 відповідність (daat).
aabc daaat 2 відповідності (aabc та daaat).
aabc daaaat 2 відповідності (aabc та daaaat).

Розглянемо ще один приклад. Наступний регулярний вираз [0-9]{2,4} відповідає як мінімум 2, але не більше 4 цифрам.

Шаблон Рядок Відповідає?
[0-9]{2,4} ab123sde 1 відповідність (ab123sde).
12 та 345673 3 відповідності (12, 3456, 73).
1 та 2 Немає відповідностей.

Метасимвол | (вертикальна риска)

Вертикальна риска | використовується для чергування (оператор or).

Шаблон Рядок Відповідає?
a|b cde Немає відповідностей.
ade 1 відповідність (ade).
acdbea 3 відповідності (acdbea).

Тут шаблон a|b відповідає будь-якому рядку, який містить або a, або b.

Метасимвол () (круглі дужки)

Круглі дужки () використовуються для створення підшаблонів. Наприклад, (a|b|c)xz відповідає будь-якому рядку, який містить або a, або b, або c, за якими слідує xz.

Шаблон Рядок Відповідає?
(a|b|c)xz ab xz Немає відповідностей.
abxz 1 відповідність (abxz).
axz cabxz 2 відповідності (axz cabxz).

Метасимвол \ (бекслеш)

Бекслеш \ використовується для екранування різних символів, включаючи метасимволи. Наприклад, шаблон \$a відповідає рядку, який містить символ $, за яким слідує a. Тут символ $ не є метасимволом, а є звичайним знаком долара.

Якщо ви не впевнені, чи має якийсь символ спеціальне значення, чи ні, ви можете вказати \ перед ним, щоб переконатися, що цей символ не обробляється особливим способом.

Спеціальні послідовності

Спеціальні послідовності спрощують написання шаблонів, що часто використовуються. Ось список спеціальних послідовностей в Python:

\A — відповідає послідовності, коли вказані символи знаходяться на початку рядка.

Шаблон Рядок Відповідає?
\Athe the sun 1 відповідність.
In the sun Немає відповідностей.

\b — відповідає послідовності, коли вказані символи знаходяться на початку або наприкінці слова.

Шаблон Рядок Відповідає?
\bfoo football 1 відповідність.
a football 1 відповідність.
afootball Немає відповідностей.
foo\b the foo 1 відповідність.
the afoo test 1 відповідність.
the afootest Немає відповідностей.

\B — протилежність \b. Відповідає послідовності, коли вказані символи не знаходяться на початку або в кінці слова.

Шаблон Рядок Відповідає?
\Bfoo football Немає відповідностей.
a football Немає відповідностей.
afootball 1 відповідність.
foo\b the foo Немає відповідностей.
the afoo test Немає відповідностей.
the afootest 1 відповідність.

\d — відповідає будь-якій десятковій цифрі, рівнозначне [0-9].

Шаблон Рядок Відповідає?
\d 12abc3 3 відповідності (12abc3)
Python Немає відповідностей.

\D — відповідає будь-якій не десятковій цифрі, рівнозначне [^0-9].

Шаблон Рядок Відповідає?
\D 1ab34″50 3 відповідності (на 1ab3450)
1345 Немає відповідностей.

\s — відповідає послідовності, коли рядок містить будь-який знак пробілу, рівнозначно [ \t\n\r\f\v].

Шаблон Рядок Відповідає?
\s Python RegEx 1 відповідність.
PythonRegEx Немає відповідностей.

\S — відповідає послідовності, коли рядок містить будь-який символ, крім пробілу, рівнозначне [^ \t\n\r\f\v].

Шаблон Рядок Відповідає?
\S a b 2 відповідності (a b).
Немає відповідностей.

w — відповідає будь-якому буквенно-цифровому символу (цифри та букви). Рівнозначне [a-zA-Z0-9_]. До речі, нижнє підкреслення _ також вважається буквенно-цифровим символом.

Шаблон Рядок Відповідає?
\w 12&”: ;c 3 відповідності (12&”: ;c).
%”> ! Немає відповідностей.

\W — відповідає будь-якому не буквенно-цифровому символу, рівнозначне [^a-zA-Z0-9_].

Шаблон Рядок Відповідає?
\W 1a2%c 1 відповідність (1a2%c).
Python Немає відповідностей.

\Z — відповідає послідовності, коли вказані символи знаходяться в кінці рядка.

Шаблон Рядок Відповідає?
Python\Z I like Python 1 відповідність.
I like Python Programming Немає відповідностей.
Python is fun Немає відповідностей.

Порада: Для написання та тестування регулярних виразів ви можете використовувати сайт regex101.

Тепер, коли ми розглянули основи регулярних виразів у Python, поговоримо про те, як їх можна використовувати в коді.

Використання регулярних виразів у Python

Python має модуль re для роботи з регулярними виразами. Для їх використання нам потрібно спочатку імпортувати модуль:

Модуль визначає кілька методів та констант для роботи з регулярними виразами.

Метод re.findall()

Метод re.findall() повертає список рядків, які відповідають шаблону регулярного виразу. Наприклад:

Результат:

['12', '89', '34']

Якщо відповідності шаблону не знайдено, то метод re.findall() поверне порожній список.

Метод re.split()

Метод re.split() розділяє рядок, де є відповідність та повертає список рядків, де відбулися розділення. Наприклад:

Результат:

['Twelve:', ' Eighty nine:', '.']

Якщо шаблонів не знайдено, метод re.split() повертає список, що містить вихідний рядок.

Ми можемо передати аргумент maxsplit в метод re.split(). Це максимальна кількість операцій розділення, які можуть бути виконані. Наприклад:

Результат:

['Twelve:', ' Eighty nine:89 Nine:9.']

До речі, значенням за замовчуванням maxsplit є 0, що означає всі можливі розділення.

Метод re.sub()

Синтаксис методу re.sub() наступний:

Метод повертає рядок, у якому співпадаючі входження замінюються вмістом змінної replace. Наприклад:

Результат:

abc12de23f456

Якщо відповідностей шаблону не знайдено, метод re.sub() повертає вихідний рядок.

Ви можете передати змінну count як четвертий параметр методу re.sub(). Якщо цей параметр не передано, його значенням буде 0. Наприклад:

Результат:

abc12de 23
f45 6

Метод re.subn()

Метод re.subn() схожий на метод re.sub() за винятком того, що він повертає кортеж з 2 елементів, що містить новий рядок та кількість зроблених замін. Наприклад:

Результат:

('abc12de23f456', 4)

Метод re.search()

Метод re.search() приймає два аргументи: шаблон та рядок. Метод шукає перше входження. Якщо пошук успішний, метод re.search() повертає об’єкт Match; якщо ні, повертає None.

Наприклад:

Результат:

pattern found inside the string

Тут match містить об’єкт Match.

Об’єкт Match

Ми можемо отримати методи та атрибути об’єкта Match, використовуючи функцію dir().

Розглянемо деякі з часто використовуваних методів та атрибутів:

Метод match.group()

Метод match.group() повертає частину рядка, у якій є відповідність. Наприклад:

Результат:

801 35

Тут змінна match містить об’єкт Match.

Наш шаблон (\d{3}) (\d{2}) має два підшаблони: (\d{3}) та (\d{2 }). Ми можемо отримати відповідності для підшаблонів, наприклад:

Методи match.start(), match.end(), match.span()

Метод match.start() повертає індекс початку співпадаючого підрядка. Метод match.end() повертає індекс кінця співпадаючого підрядка.

Метод match.span() повертає кортеж, який містить початковий і кінцевий індекси співпадаючої частини.

Атрибути match.re та match.string

Атрибут re об’єкта Match повертає об’єкт регулярного виразу. Так само атрибут string повертає переданий рядок.

Примітка: Ми розглянули часто використовувані методи, визначені в модулі re. Якщо хочете дізнатися більше, читайте Модуль re в Python.

Використання префікса r перед регулярним виразом

Коли використовується префікс r або R перед регулярним виразом, це означає необроблений (“сирий”) рядок. Наприклад, '\n' — символ переходу рядка (новий рядок), тоді як r'\n' означає два символи: бекслеш \, за яким слідує n.

Бекслеш \ використовується для екранування різних символів, включаючи метасимволи. Таким чином, використання префікса r робить бекслеш \ звичайним символом у шаблоні регулярного виразу. Наприклад:

Результат:

['\n', '\r']

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (10 оцінок, середня: 5,00 з 5)
Завантаження...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *