['I ', 'I ']
И наконец, сочетание wish, перед которым находится I:
>>> re.findall('(?<=I) wish', source)
[' wish', ' wish']
Существует несколько ситуаций, в которых правила шаблонов регулярных выражений конфликтуют с правилами для строк Python. Следующий шаблон должен совпасть с любым словом, которое начинается с fish:
>>> re.findall('\bfish', source)
[]
Почему этого не произошло? Как мы говорили в главе 2, 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
>>> m.group()
'a dish of fish'
>>> m.groups()
('a dish', 'fish')
>>> m.group('DISH')
'a dish'
>>> m.group('FISH')
'fish'
Бинарные данные
Работать с текстовыми данными может быть трудно, но работать с бинарными может быть… интересно. Вам нужно знать о таких концепциях, как
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:
>>> b'\x61'
b'a'
>>> b'\x01abc\xff'
b'\x01abc\xff'
В следующем примере показано, что вы не можете изменить переменную типа bytes:
>>> the_bytes[1] = 127
Traceback (most recent call last):
··File "
TypeError: 'bytes' object does not support item assignment
Но переменная типа bytearray слишком мягкая и легко изменяемая:
>>> the_byte_array = bytearray(blist)
>>> the_byte_array
bytearray(b'\x01\x02\x03\xff')
>>> the_byte_array[1] = 127