>>> if m:··# функция search возвращает объект
…·····print(m.group())
…
Frank
В предыдущих примерах мы искали только одно совпадение. Но что, если вы хотите узнать, сколько раз строка, содержащая один символ 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()):
>>> m = re.split('n', source)
>>> m····# функция split возвращает список
['You', 'g Fra', 'ke', 'stei', '']
Этот метод похож на метод 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.
Шаблон | Совпадения |
\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']