Регулярные выражения не ограничиваются символами ASCII. Шаблон \d совпадет со всем, что в кодировке Unicode считается цифрой, а не только с символами ASCII от 0 до 9. Добавим две буквы в нижнем регистре не из ASCII из FileFormat.info.
В этой проверке мы добавим туда следующие символы:
• три буквы ASCII;
• три знака препинания, которые не должны совпасть с шаблоном \w;
• символ Unicode LATIN SMALL LETTER E WITH CIRCUMFLEX (\u00ea);
• символ Unicode LATIN SMALL LETTER E WITH BREVE (\u0115):
>>> x = 'abc' + '-/*' + '\u00ea' + '\u0115'
Как и ожидалось, этот шаблон нашел только буквы:
>>> re.findall('\w', x)
['a', 'b', 'c', 'к', 'e']
Теперь сделаем пиццу из знаков препинания, используя основные спецификаторы шаблонов для регулярных выражений, показанные в табл. 7.4.
В этой таблице
Шаблон | Совпадения |
---|---|
abc | Буквосочетание abc |
(expr) | expr |
expr1 | expr2 | expr1 или expr2 |
Любой символ, кроме \n | |
^ | Начало строки источника |
$ | Конец строки источника |
prev? | Ноль или одно включение prev |
prev * | Ноль или больше включений prev, максимальное количество |
prev *? | Ноль или больше включений prev, минимальное количество |
prev + | Одно или больше включений prev, максимальное количество |
prev +? | Одно или больше включений prev, минимальное количество |
prev { m } | m последовательных включений prev |
prev { m, n } | От m до n последовательных включений prev, максимальное количество |
prev { m, n }? | От m до n последовательных включений prev, минимальное количество |
[abc] | a, или b, или c (аналогично a|b|c) |
[^abc] | Не (a, или b, или c) |
prev (?= next) | prev, если за ним следует next |
prev (?! next) | prev, если за ним не следует next |
(?<=prev) next | next, если перед ним находится prev |
(? | next, если перед ним не находится prev |
У вас могло зарябить в глазах при попытке прочесть эти примеры. Для начала определим строку-источник:
>>> source = '''I wish I may, I wish I might
… Have a dish of fish tonight.'''
Найдем во всем тексте строку 'wish':
>>> re.findall('wish', source)
['wish', 'wish']
Далее найдем во всем тексте строки 'wish' или 'fish':
>>> re.findall('wish|fish', source)
['wish', 'wish', 'fish']
Найдем строку 'wish' в начале текста:
>>> re.findall('^wish', source)
[]
Найдем строку 'I wish' в начале текста:
>>> re.findall('^I wish', source)
['I wish']
Найдем строку 'fish' в конце текста:
>>> re.findall('fish$', source)
[]
Наконец, найдем строку 'fish tonight.$' в конце текста:
>>> re.findall('fish tonight.$', source)
['fish tonight.']
Символы ^ и $ называются
>>> re.findall('fish tonight\.$', source)
['fish tonight.']
Начнем с поиска символов w или f, за которым следует буквосочетание ish:
>>> re.findall('[wf]ish', source)
['wish', 'wish', 'fish']
Найдем одно или несколько сочетаний символов w, s и h:
>>> re.findall('[wsh]+', source)
['w', 'sh', 'w', 'sh', 'h', 'sh', 'sh', 'h']
Найдем сочетание ght, за которым следует любой символ, кроме буквенного или цифрового символа или знака подчеркивания:
>>> re.findall('ght\W', source)
['ght\n', 'ght.']
Найдем символ I, за которым следует сочетание wish:
>>> re.findall('I (?=wish)', source)