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

Начиная с границы слова, любое число символов слова, три гласные и далее любые символы, не являющиеся гласными, до конца слова:

>>>> 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'

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

>['queen', 'quietly', 'beau', 'queen', 'squeeze', 'queen']

Что это показывает? Среди всего прочего, что регулярные выражения могут сделать многое, но их может быть очень трудно написать правильно.

12. Используйте метод unhexlify для того, чтобы преобразовать эту шестнадцатеричную строку (созданную путем объединения двух строк, что позволило ей разместиться на странице) в переменную типа bytes с именем gif:

>'47494638396101000100800000000000ffffff21f9' +

>'0401000000002c000000000100010000020144003b'

>>>> import binascii

>>>> hex_str = '47494638396101000100800000000000ffffff21f9' + \

>…·····'0401000000002c000000000100010000020144003b'

>>>> gif = binascii.unhexlify(hex_str)

>>>> len(gif)

>42

13. Байты, содержащиеся в переменной gif, определяют однопиксельный прозрачный GIF-файл. Этот формат является одним из самых распространенных. Корректный файл формата GIF начинается со строки GIF89a. Является ли этот файл корректным?

>>>> gif[:6] == b'GIF89a'

>True

Обратите внимание на то, что нам нужно использовать b, чтобы указать, что строка состоит из байтов, а не из символов Unicode. Вы можете сравнить байты с байтами, но не можете сравнивать байты и символы:

>>>> gif[:6] == 'GIF89a'

>False

>>>> type(gif)

>

>>>> type('GIF89a')

>

>>>> type(b'GIF89a')

>

14. Ширина файла формата GIF является шестнадцатибитным целым числом с обратным порядком байтов, которое начинается со смещения 6 байт. Его высота имеет такой же размер и начинается со смещения 8 байт. Извлеките и выведите на экран эти значения для переменной gif. Равны ли они 1?