Python: поиск вхождений и замена в строках используя регулярки

Что такое регулярки?

Регулярные выражения (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

 

Рейтинг
( 2 оценки, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями: