Подтвердить что ты не робот

Регулярное выражение синтаксического анализа двоичного файла?

У меня есть файл, который смешивает двоичные данные и текстовые данные. Я хочу проанализировать его с помощью регулярного выражения, но я получаю эту ошибку:

TypeError: can't use a string pattern on a bytes-like object

Я предполагаю, что это сообщение означает, что Python не хочет разбирать двоичные файлы. Я открываю файл с флагами "rb".

Как я могу разобрать двоичные файлы с регулярными выражениями в Python?

EDIT: Я использую Python 3.2.0

4b9b3361

Ответ 1

Я думаю, вы используете Python 3.

1. Открытие файла в двоичном режиме является простым, но тонким. Единственное различие от его открытия в текстовом режиме это параметр mode содержит 'b'характер.

........

4. Имеет одно отличие: объект двоичный поток не имеет кодировки атрибут. Это имеет смысл, не так ли? Вы читаете (или записываете) байты, а не строки, поэтому theres нет преобразования для Python.

http://www.diveintopython3.net/files.html#read

Затем, в Python 3, поскольку двоичный поток из файла представляет собой поток байтов, регулярное выражение для анализа потока из файла должно быть определено с помощью последовательности байтов, а не последовательности символов.

В Python 2 строка была массивом байты, кодировка символов которых отслеживается отдельно. Если бы вы хотели Python 2 отслеживать кодирования символов, вам пришлось использовать Строка Unicode (u ''). Но в Python 3, строка всегда Python 2 называется строкой Unicode - т.е. массив Unicode символов (возможно, варьируемого байта длина).

http://www.diveintopython3.net/case-study-porting-chardet-to-python-3.html

и

В Python 3 все строки являются последовательностями символов Unicode. Здесь нет такая вещь, как закодированная строка Python в UTF-8 или в кодировке Python как СР-1252. "Это строка UTF-8?" является неверный вопрос. UTF-8 - это способ кодирование символов в виде последовательности байт. Если вы хотите взять строку и превратить его в последовательность байтов в конкретной кодировке символов, Python 3 поможет вам в этом.

http://www.diveintopython3.net/strings.html#boring-stuff

и

4,6. Строки против байтов # Байты - байты; символы являются абстракцией. Неизменяемая последовательность Unicode символы называются строкой. неизменяемая последовательность число-от-0 до 255 называется байтов.

....

1. Чтобы определить объект байта, используйте синтаксис b '' 'byte literal. Каждый байт в байтовом литерале может быть Символ ASCII или закодированный шестнадцатеричное число от \x00 до\xff (0-255).

http://www.diveintopython3.net/strings.html#boring-stuff

Итак, вы будете определять свое регулярное выражение следующим образом

pat = re.compile(b'[a-f]+\d+')

а не как

pat = re.compile('[a-f]+\d+')

Дополнительные пояснения здесь:

15.6.4. Невозможно использовать строковый шаблон для байтового объекта

Ответ 2

В вашем re.compile вам нужно использовать объект bytes, обозначенный начальным b:

r = re.compile(b"(This)")

Это Python 3 придирчивы к разнице между строками и байтами.

Ответ 3

Преобразуйте файл в hexadecimal_string_byte_representation и обработайте его как текстовую строку

Ответ 4

Это работает для меня для python 2.6

>>> import re
>>> r = re.compile(".*(ELF).*")
>>> f = open("/bin/ls")
>>> x = f.readline()
>>> r.match(x).groups()
('ELF',)