Это упражнение с подвохом. Мы получаем правильный результат для слов,
которые заканчиваются на «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». Мы можем обработать этот крайний случай,
456
Приложение Д. Ответы к упражнениям
добавив апостроф в список символов, с которыми должен совпасть набор сим-
волов. Наша первая попытка не работает:
>>> >>> pat = r'\b[\w']*l\b'
File "<stdin>", 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. Найдите все слова, которые содержат три гласные подряд.
Начиная с границы слова, любое число символов слова, три гласные и далее
любые символы, не являющиеся гласными, до конца слова:
>>> pat = r'\b\w*[aeiou]{3}[^aeiou]\w*\b'
>>> re.findall(pat, mammoth)
['queen', 'quietly', 'beau\nIn', 'queen', 'squeeze', 'queen']
Выглядит правильно, за исключением строки 'beau\nIn'. Мы искали строку
mammoth целиком. Конструкция [^aeiou] совпадает с любыми символами, не яв-
ляющимися гласными, включая \n (перенос строки, который отмечает конец
текстовой строки). Нам нужно добавить еще кое-что в набор игнорируемых
символов: \s совпадает с любыми символами пробелов, включая \n:
>>> pat = r'\b\w*[aeiou]{3}[^aeiou\s]\w*\b'
>>> re.findall(pat, mammoth)
['queen', 'quietly', 'queen', 'squeeze', 'queen']
В этот раз мы не нашли слово beau, поэтому нужно внести в шаблон еще одно ис-
правление: совпадение с любым числом (даже нулем) не гласных после трех глас-
ных. Наш предыдущий шаблон всегда совпадал с одним не гласным символом:
>>> pat = r'\b\w*[aeiou]{3}[^aeiou\s]*\w*\b'