Что такое регулярки?
Регулярные выражения (regex) позволяют вам выполнять сложный поиск подстроки в тексте для различных целей: проверка вхождения подстроки, удаление, замена и прочие действия.
В Python для этих целей предназначена библиотека re
import re
Базовый синтаксис регулярных варажений состоит из следующих операторов:
. | Любой символ, кроме новой строки \n. |
? | Должен содержать 0 или 1 вхождение |
+ | Должен содержать 1 и более вхождений |
* | Должен содержать 0 и более вхождений |
\w | Любая цифра или буква (\W — все, кроме буквы или цифры) |
\d | Любая цифра [0-9] (\D — все, кроме цифры) |
\s | Любой пробельный символ (\S — любой непробельный символ) |
\b | Граница слова |
[..] | Один из символов в скобках ([^..] — любой символ, кроме тех, что в скобках) |
\ | Экранирование специальных символов (\. означает точку или \+ означает знак «плюс») |
^ и $ | Начало и конец строки соответственно |
{n,m} | От n до m вхождений ({,m} — от 0 до m) |
a|b | Соответствует a или b |
() | Группирует выражение и возвращает найденный текст |
\t, \n, \r | Символ табуляции, новой строки и возврата каретки соответственно |
Поиск подстроки в тексте
В Python поиск подстроки осуществляется при помощи функций re.match(), re.search(), re.finditer() и re.findall().
Первые 3 метода возвращают None если ничего не найдено, и объект Match если что-то нашлось.
Объект Match
Чтобы работать с найденным результатом, полезно знать, что включает в себя объект Match.
- group() или group(0) — возвращает найденную подстроку полностью, которая совпала с выражением,
- group(N) где N номер группы — вернет только подстроку соответствующей группы,
- groups() — вернет кортеж, элементы которого являются подстроками которые попали в соответствующие группы,
- groupdict() — вернет словарь, ключами которого являются имена групп, а их значения — соответствующие подстроки,
- start, end — вернет начальный и конечный индекс совпадения с регулярным выражением,
- span — вернет кортеж с начальным и конечным индексом совпадения с регулярным выражением.
re.match(pattern, string)
Данный метод позволяет искать по заданному шаблону только в начале строки. Если найдено, то возвращает объект Match с найденным совпадением, иначе (если не найдено) вернет None.
re.search(pattern, string)
В отличие от re.match() ищет по всей строки. Если найдено, то возвращает объект Match с первым найденным совпадением, иначе (если не найдено) вернет None.
re.findall(pattern, string)
Также как и re.search ищет вхождения по всей строке, но в ответе возвращает все вхождения в виде списка (list).
Примеры поиска подстроки
import re # исходные строки born1 = "27-11-1984 #ABC Дата рождения # 27-11-1984" born2 = "ABC#27-11-1984 # Дата рождения # 27-11-1984" # пример поиска при помощи match() r1 = re.match(r'ABC', born1) r2 = re.match(r'ABC', born2) if r1: print(f'r1: {r1.group()}') if r2: print(f'r2: {r2.group()}') # РЕЗУЛЬТАТ ОТВЕТА: > r2: ABC # пример поиска при помощи search() r1 = re.search(r'ABC', born1) r2 = re.search(r'ABC', born2) if r1: print(f'r1: {r1.group()}') if r2: print(f'r2: {r2.group()}') # РЕЗУЛЬТАТ ОТВЕТА: > r1: ABC > r2: ABC # пример поиска при помощи findall() born3 = "ABC#27-11-1984 #ABC Дата рождения # 27-11-1984" r3 = re.findall(r'ABC', born3) if r3: print(f'r3: {r3}') # РЕЗУЛЬТАТ ОТВЕТА: > r3: ['ABC', 'ABC']
Разделение и замена подстрок
re.split(pattern, string, [maxsplit=0])
Данный метод разделяет строку по заданному шаблону и формирует список (list). Параметр maxsplit позволяет ограничивать количество частей, на которые следует разделять строку.
import re born3 = "ABC#27-11-1984 #ABC Дата рождения # 27-11-1984" r3 = re.split(r'ABC', born3) if r3: print(f'r3: {r3}') # РЕЗУЛЬТАТ ОТВЕТА: r3: ['', '#27-11-1984 #', ' Дата рождения # 27-11-1984']
re.sub(pattern, repl, string)
Данный метод позволяет произвести замену одной подстроки в тексте на другую. Пример замены подстроки «ABC» на пустое значение.
born3 = "ABC#27-11-1984 #ABC Дата рождения # 27-11-1984" r3 = re.sub(r'ABC', '', born3) if r3: print(f'r3: {r3}') # РЕЗУЛЬТАТ ОТВЕТА: r3: #27-11-1984 # Дата рождения # 27-11-1984
Компиляция шаблона регулярного выражения
Иногда есть потребность один раз задать шаблон регулярного выражения, а дальше вызывать его в нескольких местах.
Для этого удобнее всего обернуть этот шаблон регулярки в объект при помощи метода re.compile.
import re # строка born3 = "ABC#27-11-1984 #ABC Дата рождения # 27-11-1984" # шаблон регулярки оборачиваем в объект при помощи compile regex = re.compile('ABC') # теперь из этого объекта мы можем вызывать все те же методы, при этом не указывая в их аргументе pattern r3 = regex.sub('', born3) if r3: print(f'r3: {r3}') # РЕЗУЛЬТАТ ОТВЕТА: r3: #27-11-1984 # Дата рождения # 27-11-1984