>>> 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Пробельный символ
\SНепробельный символ
\bГраница слова
\BНе граница слова

Модуль Python string содержит заранее определенные строковые константы, которые мы можем использовать для тестирования. Мы воспользуемся константой printable, которая содержит 100 печатаемых символов ASCII, включая буквы в обоих регистрах, цифры, пробелы и знаки пунктуации:

>>> import string

>>> printable = string.printable

>>> len(printable)

100

>>> printable[0:50]

'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN'

>>> printable[50:]

'OPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

Какие символы строки printable являются цифрами?

>>> re.findall('\d', printable)

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

Какие символы являются цифрами, буквами и нижним подчеркиванием?

>>> re.findall('\w', printable)

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b',

'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',

'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',

'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',

'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',

'Y', 'Z', '_']

Какие символы являются пробелами?

>>> re.findall('\s', printable)

[' ', '\t', '\n', '\r', '\x0b', '\x0c']

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Похожие книги