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

для строк. Например, \b для строки означает «возврат на шаг», но в мини-языке регулярных выражений эта последовательность означает начало слова. Избегайте случайного применения управляющих последовательностей, используя неформатированные строки Python, когда определяете строку регулярного выражения. Всегда размещайте символ r перед строкой шаблона регулярного выражения, и управляющие последовательности Python будут отключены, как показано здесь:

>>>> re.findall(r'\bfish', source)

>['fish']

Шаблоны: указываем способ вывода совпадения

При использовании функций match() или search() все совпадения можно получить из объекта результата m, вызвав функцию m.group(). Если вы заключите шаблон в круглые скобки, совпадения будут сохранены в отдельную группу и кортеж, состоящий из них, окажется доступен благодаря вызову m.groups(), как показано здесь:

>>>> m = re.search(r'(. dish\b).*(\bfish)', source)

>>>> m.group()

>'a dish of fish'

>>>> m.groups()

>('a dish', 'fish')

Если вы используете этот шаблон (?P< name > expr), он совпадет с выражением expr, сохраняя совпадение в группе name:

>>>> m = re.search(r'(?P. dish\b).*(?P\bfish)', source)

>>>> m.group()

>'a dish of fish'

>>>> m.groups()

>('a dish', 'fish')

>>>> m.group('DISH')

>'a dish'

>>>> m.group('FISH')

>'fish'

Бинарные данные

Работать с текстовыми данными может быть трудно, но работать с бинарными может быть… интересно. Вам нужно знать о таких концепциях, как порядок следования байтов (как процессор вашего компьютера разбивает данные на байты) и знаковые биты для целых чисел. Вам может понадобиться закопаться в бинарные форматы файлов или сетевых пакетов, чтобы извлечь или даже изменить данные. В этом разделе я покажу вам основы работы с бинарными данными в Python.

bytes и bytearray

В Python 3 появились следующие последовательности восьмибитных целых чисел, имеющих возможные значения от 0 до 255. Они могут быть двух типов:

• bytes неизменяем, как кортеж байтов;

• bytearray изменяем, как список байтов.

Начнем мы с создания списка с именем blist и в следующем примере создадим переменную типа bytes с именем the_bytes и переменную bytearray с именем the_byte_array:

>>> blist = [1, 2, 3, 255]

>>>> the_bytes = bytes(blist)

>>>> the_bytes

>b'\x01\x02\x03\xff'

>>>> the_byte_array = bytearray(blist)

>>>> the_byte_array

>bytearray(b'\x01\x02\x03\xff')


Представление значения типа bytes начинается с символа b и кавычки, за которыми следуют шестнадцатеричные последовательности вроде \x02 или символы ASCII, заканчивается конструкция соответствующим символом кавычки. Python преобразует шестнадцатеричные последовательности или символы ASCII в маленькие целые числа, но показывает байтовые значения, которые корректно записаны с точки зрения кодировки ASCII: