Регулярное выражение для разбора двоичного файла? - PullRequest
31 голосов
/ 11 апреля 2011

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

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

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

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

РЕДАКТИРОВАТЬ: Я использую Python3.2.0

Ответы [ 3 ]

29 голосов
/ 11 апреля 2011

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

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

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

26 голосов
/ 11 апреля 2011

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

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

........

4.Все есть одно отличие: двоичный поток объект не имеет кодировки приписывать. Это имеет смысл, верно? Вы читаете (или пишете) байты , а не строки, поэтому нет преобразования для 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 все строки являются последовательностями символов Юникода . Здесь нет такая вещь, как строка Python в кодировке в UTF-8 или в кодировке строки Python как CP-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. Невозможно использовать строковый шаблон в байтовоподобном объекте

0 голосов
/ 11 апреля 2011

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

>>> import re
>>> r = re.compile(".*(ELF).*")
>>> f = open("/bin/ls")
>>> x = f.readline()
>>> r.match(x).groups()
('ELF',)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...