Регулярні вирази в Python (скор. “RegEx” від англ. “Regular Expression”) — це послідовність символів, які визначають шаблон для пошуку відповідностей. Наприклад:
|
1 |
^a...s$ |
Цей код визначає шаблон регулярного виразу, який відповідає будь-якому рядку з 5 букв, що починається на a, та закінчується на s.
Шаблон, визначений за допомогою регулярного виразу, може бути використаний для знаходження відповідностей у рядках.
| Шаблон | Рядок | Відповідає? |
| ^a…s$ | abs | Немає відповідностей. |
| alias | 1 відповідність. | |
| abyss | 1 відповідність. | |
| Alias | Немає відповідностей. | |
| An abacus | Немає відповідностей. |
Python має модуль re для роботи з регулярними виразами. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 |
import re pattern = '^a...s$' test_string = 'abyss' result = re.match(pattern, test_string) if result: print("Search successful.") else: print("Search unsuccessful.") |
Тут ми використали метод 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 відповідності (на 1ab34“50) |
| 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 для роботи з регулярними виразами. Для їх використання нам потрібно спочатку імпортувати модуль:
|
1 |
import re |
Модуль визначає кілька методів та констант для роботи з регулярними виразами.
Метод re.findall()
Метод re.findall() повертає список рядків, які відповідають шаблону регулярного виразу. Наприклад:
|
1 2 3 4 5 6 7 8 9 |
# Програма для вилучення чисел з рядка import re string = 'hello 12 hi 89. Howdy 34' pattern = '\d+' result = re.findall(pattern, string) print(result) |
Результат:
['12', '89', '34']
Якщо відповідності шаблону не знайдено, то метод re.findall() поверне порожній список.
Метод re.split()
Метод re.split() розділяє рядок, де є відповідність та повертає список рядків, де відбулися розділення. Наприклад:
|
1 2 3 4 5 6 7 |
import re string = 'Twelve:12 Eighty nine:89.' pattern = '\d+' result = re.split(pattern, string) print(result) |
Результат:
['Twelve:', ' Eighty nine:', '.']
Якщо шаблонів не знайдено, метод re.split() повертає список, що містить вихідний рядок.
Ми можемо передати аргумент maxsplit в метод re.split(). Це максимальна кількість операцій розділення, які можуть бути виконані. Наприклад:
|
1 2 3 4 5 6 7 8 9 |
import re string = 'Twelve:12 Eighty nine:89 Nine:9.' pattern = '\d+' # maxsplit = 1 # Розділяє тільки першу відповідність result = re.split(pattern, string, 1) print(result) |
Результат:
['Twelve:', ' Eighty nine:89 Nine:9.']
До речі, значенням за замовчуванням maxsplit є 0, що означає всі можливі розділення.
Метод re.sub()
Синтаксис методу re.sub() наступний:
|
1 |
re.sub(pattern, replace, string) |
Метод повертає рядок, у якому співпадаючі входження замінюються вмістом змінної replace. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Програма для видалення всіх пробілів import re # Багаторядковий рядок string = 'abc 12\ de 23 \n f45 6' # Відповідність всім символам пробілу pattern = '\s+' # Порожній рядок replace = '' new_string = re.sub(pattern, replace, string) print(new_string) |
Результат:
abc12de23f456
Якщо відповідностей шаблону не знайдено, метод re.sub() повертає вихідний рядок.
Ви можете передати змінну count як четвертий параметр методу re.sub(). Якщо цей параметр не передано, його значенням буде 0. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
import re # Багаторядковий рядок string = 'abc 12\ de 23 \n f45 6' # Відповідність усім символам пробілу pattern = '\s+' replace = '' new_string = re.sub(r'\s+', replace, string, 1) print(new_string) |
Результат:
Метод re.subn()
Метод re.subn() схожий на метод re.sub() за винятком того, що він повертає кортеж з 2 елементів, що містить новий рядок та кількість зроблених замін. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Програма видалення всіх символів пробілу import re # Багаторядковий рядок string = 'abc 12\ de 23 \n f45 6' # Відповідність усім символам пробілу pattern = '\s+' # Порожній рядок replace = '' new_string = re.subn(pattern, replace, string) print(new_string) |
Результат:
Метод re.search()
Метод re.search() приймає два аргументи: шаблон та рядок. Метод шукає перше входження. Якщо пошук успішний, метод re.search() повертає об’єкт Match; якщо ні, повертає None.
|
1 |
match = re.search(pattern, str) |
Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 |
import re string = "Python is fun" # Перевіряємо, чи є слово 'Python' на початку рядка match = re.search('\APython', string) if match: print("pattern found inside the string") else: print("pattern not found") |
Результат:
pattern found inside the string
Тут match містить об’єкт Match.
Об’єкт Match
Ми можемо отримати методи та атрибути об’єкта Match, використовуючи функцію dir().
Розглянемо деякі з часто використовуваних методів та атрибутів:
Метод match.group()
Метод match.group() повертає частину рядка, у якій є відповідність. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import re string = '39801 356, 2102 1111' # Тризначне число через пробіл, за яким слідує двозначне число pattern = '(\d{3}) (\d{2})' # Змінна match містить об'єкт Match match = re.search(pattern, string) if match: print(match.group()) else: print("pattern not found") |
Результат:
801 35
Тут змінна match містить об’єкт Match.
Наш шаблон (\d{3}) (\d{2}) має два підшаблони: (\d{3}) та (\d{2 }). Ми можемо отримати відповідності для підшаблонів, наприклад:
|
1 2 3 4 5 6 7 8 9 10 |
>>> match.group(1) '801' >>> match.group(2) '35' >>> match.group(1, 2) ('801', '35') >>> match.groups() ('801', '35') |
Методи match.start(), match.end(), match.span()
Метод match.start() повертає індекс початку співпадаючого підрядка. Метод match.end() повертає індекс кінця співпадаючого підрядка.
|
1 2 3 4 |
>>> match.start() 2 >>> match.end() 8 |
Метод match.span() повертає кортеж, який містить початковий і кінцевий індекси співпадаючої частини.
|
1 2 |
>>> match.span() (2, 8) |
Атрибути match.re та match.string
Атрибут re об’єкта Match повертає об’єкт регулярного виразу. Так само атрибут string повертає переданий рядок.
|
1 2 3 4 5 |
>>> match.re re.compile('(\\d{3}) (\\d{2})') >>> match.string '39801 356, 2102 1111' |
Примітка: Ми розглянули часто використовувані методи, визначені в модулі re. Якщо хочете дізнатися більше, читайте Модуль re в Python.
Використання префікса r перед регулярним виразом
Коли використовується префікс r або R перед регулярним виразом, це означає необроблений (“сирий”) рядок. Наприклад, '\n' — символ переходу рядка (новий рядок), тоді як r'\n' означає два символи: бекслеш \, за яким слідує n.
Бекслеш \ використовується для екранування різних символів, включаючи метасимволи. Таким чином, використання префікса r робить бекслеш \ звичайним символом у шаблоні регулярного виразу. Наприклад:
|
1 2 3 4 5 6 |
import re string = '\n and \r are escape sequences.' result = re.findall(r'[\n\r]', string) print(result) |
Результат:
['\n', '\r']
