Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 351

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». Мы можем обработать этот крайний случай,

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'