Простой Python. Современный стиль программирования (Любанович) - страница 108

Вы можете использовать функцию search(), чтобы найти шаблон 'Frank' в любом месте строки-источника 'Young Frankenstein', не прибегая к использованию символа подстановки.*:

>>>> m = re.search('Frank', source)

>>>> if m:··# функция search возвращает объект

>…·····print(m.group())

>…

>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']

Разбиваем совпадения с помощью функции 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) — это символ?.

Специальные символы показаны в табл. 7.3.


Таблица 7.3. Специальные символы
ШаблонСовпадения
\dЦифровой символ
\DНецифровой символ
\wБуквенный или цифровой символ или знак подчеркивания
\WЛюбой символ, кроме буквенного или цифрового символа или знака подчеркивания
\s