17 — Разбиения с регулярными выражениями | Питон и КИЛИ

Содержание

  • Особенности re.findall при использовании групп
  • Разбиение строки регулярным выражением с помощью re.split

re.findall и группы

Как мы помним, re.findall находит все вхождения шаблона в строке. Однако, если используются группы, то результирующий список будет состоять не из найденных шаблонов целиком, а из найденных групп.

>>> import re

>>> text = 'Длинношеее кооперативное воодушевление'
>>> ee = re.findall('ее', text)  # Тут русские "е" в строке и английские - в названии переменной
>>> print('ее встретилось', len(ee), 'раз')
ее встретилось 1 раз
>>> paired_letters = re.findall(r'(\w)\1', text)
>>> print('Повторяющиеся буквы:', paired_letters)
Повторяющиеся буквы: ['е', 'о', 'н', 'о']
>>> first_last = re.findall(r'\b(\w)\w+(\w)\b', text)  # \b означает границу со словом
>>> print('Первые и последние буквы каждого слова:', first_last)
Первые и последние буквы каждого слова: [('Д', 'е'), ('к', 'е'), ('в', 'е')]

Обратите внимание, что в случае одной группы re.findall возвращает просто список из строк, а в случае двух и более групп — список из кортежей строк.

re.split

Функция re.split(patterm, string, maxsplit=0, flags=0) — это аналог метода строк .split(), но в качестве разделителя вы можете использовать любое регулярное выражение. В некотором смысле re.split — это противоположность re.findall, она также возвращает список строк, но вам нужно указать что убрать из исходного текста, а не что оставить.

>>> import re

>>> text = 'А какой-бы придумать способ, чтоб разбить текст на слова, используя регулярки?'
>>> words = re.split(r'\W+', text)
>>> print(words)
['А', 'какой', 'бы', 'придумать', 'способ', 'чтоб', 'разбить', 'текст', 'на', 'слова', 'используя', 'регулярки', '']
>>> words_findall = re.findall(r'\w+', text)
>>> print(words[:-1] == words_findall)
True

При использовании групп re.split кроме отделённого текста, оставляет ещё и содержание найденных групп.

>>> import re

>>> calculation = '3 +    2* 5 / 33-    2'
>>> numbers = re.split(r'\s*[+*-/]\s*', calculation)
>>> print(numbers)
['3', '2', '5', '33', '2']
>>> numbers_and_operators = re.split(r'\s*([+*-/])\s*', calculation)
>>> print(numbers_and_operators)
['3', '+', '2', '*', '5', '/', '33', '-', '2']

Домашнее задание

Его нет