我有一个混合二进制数据和文本数据的文件。我想通过正则表达式解析它,但是我收到了这个错误:
TypeError: can't use a string pattern on a bytes-like object
我猜这条消息意味着Python不想解析二进制文件。
我正在使用"rb"
标志打开文件。
如何在Python中使用正则表达式解析二进制文件?
编辑:我正在使用Python 3.2.0
答案 0 :(得分:28)
在re.compile
中,您需要使用bytes
个对象,并以初始b
表示:
r = re.compile(b"(This)")
这是Python 3对字符串和字节之间差异的挑剔。
答案 1 :(得分:25)
我认为你使用Python 3。
1.以二进制模式打开文件很简单但很微妙。唯一的区别 从文本模式打开它是 mode参数包含'b' 字符。
........
4.但是,这是一个区别:二进制流对象没有编码 属性。这是有道理的,对吗? 您正在阅读(或写入)字节,而不是 字符串,所以没有转换 要做的Python。
然后,在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可以帮助您。
和
4.6。字符串与字节#字节是字节;字符是一种抽象。 不可变的Unicode序列 字符称为字符串。一个 不可变的序列 数字介于0和255之间称为a bytes对象。
...
1. 要定义字节对象,请使用b''“byte literal”语法。每个字节 在字节文字内可以是一个 ASCII字符或编码 从\ x00到\ xff的十六进制数 (0-255)。
因此,您将按如下方式定义正则表达式
pat = re.compile(b'[a-f]+\d+')
而不是
pat = re.compile('[a-f]+\d+')
此处有更多解释:
答案 2 :(得分:-3)
这适用于我的python 2.6
>>> import re
>>> r = re.compile(".*(ELF).*")
>>> f = open("/bin/ls")
>>> x = f.readline()
>>> r.match(x).groups()
('ELF',)