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) — это символ ?.