正则表达式解析二进制文件?

时间:2011-04-11 09:00:38

标签: python regex python-3.x parsing binary

我有一个混合二进制数据和文本数据的文件。我想通过正则表达式解析它,但是我收到了这个错误:

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

我猜这条消息意味着Python不想解析二进制文件。 我正在使用"rb"标志打开文件。

如何在Python中使用正则表达式解析二进制文件?

编辑:我正在使用Python 3.2.0

3 个答案:

答案 0 :(得分:28)

re.compile中,您需要使用bytes个对象,并以初始b表示:

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

这是Python 3对字符串和字节之间差异的挑剔。

答案 1 :(得分:25)

我认为你使用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中,所有字符串都是序列   的Unicode字符。没有   像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之间称为a   bytes对象。

     

...

     

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. Can’t use a string pattern on a bytes-like object

答案 2 :(得分:-3)

这适用于我的python 2.6

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