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

\b означает, что нужно начать с границы между словом и не словом. Используйте такую конструкцию, чтобы указать либо на начало, либо на конец слова. Литерал c — это первая буква всех слов, которые мы ищем. \w означает любой символ слова, которое включает в себя буквы, цифры и подчеркивания (_). * означает ноль или больше таких символов. Целиком это выражение находит слова, которые начинаются с «с», включая слово с. Если вы не использовали простую строку (у таких строк r стоит прямо перед открывающей кавычкой), Python интерпретирует \b как возврат на шаг и поиск по таинственной причине ничего не найдет:

>>>> pat = '\bc\w*'

>>>> re.findall(pat, mammoth)

>[]

9. Найдите все четырехбуквенные слова, которые начинаются с буквы «c»:

>>>> pat = r'\bc\w{3}\b'

>>>> re.findall(pat, mammoth)

>['city', 'cast']

Вам нужен последний символ \b, чтобы указать на конец слова. В противном случае вы получите первые четыре буквы всех слов, которые начинаются с «с» и имеют как минимум четыре буквы:

>>>> pat = r'\bc\w{3}'

>>>> re.findall(pat, mammoth)

>['chee', 'city', 'chee', 'chee', 'coul', 'chee', 'cast', 'crus']

10. Найдите все слова, которые заканчиваются на букву «r».

Это упражнение с подвохом. Мы получаем правильный результат для слов, которые заканчиваются на «r»:

>>>> pat = r'\b\w*r\b'

>>>> re.findall(pat,mammoth)

>['your', 'fair', 'Or', 'scar', 'Mr', 'far', 'For', 'your', 'or']

Однако результаты будут не так хороши, если мы поищем слова, которые заканчиваются на «l»:

>>>> pat = r'\b\w*l\b'

>>>> re.findall(pat,mammoth)

>['All', 'll', 'Provincial', 'fall']

Что здесь делает буквосочетание «ll»? Паттерн \w совпадает только c буквами, цифрами и подчеркиваниями, но не с апострофами ASCII. В результате вы увидите буквосочетание «ll». Мы можем обработать этот крайний случай, добавив апостроф в список символов, с которыми должен совпасть набор символов. Наша первая попытка не работает:

>>>> >>> pat = r'\b[\w']*l\b'

>··File "", line 1

>····pat = r'\b[\w']*l\b'

Python указывает на окрестности ошибки, но может потребоваться какое-то время, чтобы увидеть: ошибка заключалась в том, что строка шаблона окружена такими же апострофами — символами кавычки. Один из способов решить эту проблему — использовать управляющую последовательность с обратным слешем:

>>>> pat = r'\b[\w\']*l\b'

>>>> re.findall(pat, mammoth)

>['All', "you'll", 'Provincial', 'fall']

Еще одно решение — окружить строку шаблона двойными кавычками:

>>>> pat = r"\b[\w']*l\b"

>>>> re.findall(pat, mammoth)

>['All', "you'll", 'Provincial', 'fall']

11. Найдите все слова, которые содержат три гласные подряд.