Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 146

...

Frank

Ищем все совпадения

с помощью функции findall()

В предыдущих примерах мы искали только одно совпадение. Но что, если вы хо-

тите узнать, сколько раз строка, содержащая один символ n, встречается в строке-

источнике?

>>> m = re.findall('n', source)

>>> m # findall returns a list

['n', 'n', 'n', 'n']

>>> print('Found', len(m), 'matches')

Found 4 matches

Как насчет строки 'n', за которой следует любой символ?

>>> m = re.findall('n.', source)

>>> m

['ng', 'nk', 'ns']

Обратите внимание на то, что в совпадения не была записана последняя стро-

ка 'n'. Нам нужно сказать, что символ после 'n' является опциональным, с помощью

конструкции ?:

>>> m = re.findall('n.?', source)

>>> m

['ng', 'nk', 'ns', 'n']

Текстовые строки

195

Разбиваем совпадения с помощью функции split()

В следующем примере показано, как разбить строку на список с помощью шабло-

на, а не простой строки (как это делает метод split()):

>>> m = re.split('n', source)

>>> m # функция split возвращает список

['You', 'g Fra', 'ke', 'stei', '']

Заменяем совпадения с помощью функции sub()

Этот метод похож на метод replace(), но он ищет совпадения с шаблонами, а не

простые строки:

>>> m = re.sub('n', '?', source)

>>> m # sub returns a string

'You?g Fra?ke?stei?'

Шаблоны: специальные символы

Многие описания регулярных выражений начинаются с деталей, касающихся того,

как их определить. Я считаю, что это ошибка. Язык регулярных выражений не так

уж мал сам по себе, слишком много деталей должно вместиться в вашу голову

одновременно. Они используют так много знаков препинания, что это выглядит

так, будто персонажи мультиков ругаются.

Теперь, когда вы знаете о нужных функциях (match(), search(), findall()

и sub()), рассмотрим детали построения регулярных выражений. Создаваемые вами

шаблоны подойдут к любой из этих функций.

Самые простые знаки вы уже видели.

 Совпадения с любыми неспециальными символами.

 Любой отдельный символ, кроме \n, — это символ ..

 Любое число, включая 0, — это символ *.

 Опциональное значение (0 или 1) — это символ ?.