\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. Найдите все слова, которые содержат три гласные подряд.