На прошлом занятии

  • Замены - функция re.sub(pattern, repl, string)
  • Именованные группы

План этого занятия

  • Особенности 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']

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

Вам нужно сохранить у себя на компьютере исходный текст статьи из Википедии с расширением .html и в кодировке UTF-8. Программа должна читать файл и находить в ней HTML-таблицу, которая начинается с тега <table class="wikitable ..." ...> и закрываться тегом </table>. Вам нужно очистить содержимое таблицы от тегов и вывести её в текстовый файл, используя в виде разделителя столбцов символ |, а виде разделителя строк — перенос строки. Ваше решение не должно явным образом использовать знание о количестве строк и столбцов. В итоге должен получиться файл с содержимом в следующем виде:

ячейка|ячейка|...|ячейка
ячейка|ячейка|...|ячейка
...
ячейка|ячейка|...|ячейка
  1. статья “Данелия, Георгий Николаевич”
  2. статья “Леннон, Джон”
  3. статья “Москвич (завод)”, используйте только первую таблицу «Довоенные автомобили завода имени КИМ»
  4. статья “The Coca-Cola Company”
  5. статья “Созвездие”
  6. статья “Международный союз биатлонистов”
  7. статья “Съезд КПСС”

Выполните задание пройдя по ссылке в GitHub Classroom:


Улучшить эту страницу