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

Python 解析二进制文件的正则表达式?,python,regex,python-3.x,parsing,binary,Python,Regex,Python 3.x,Parsing,Binary,我有一个混合了二进制数据和文本数据的文件。我想通过正则表达式对其进行解析,但出现以下错误: TypeError:无法在类似字节的对象上使用字符串模式 我猜这条消息意味着Python不想解析二进制文件。 我正在用“rb”标志打开文件 如何用Python中的正则表达式解析二进制文件 编辑:我正在使用Python3.2.0这对我来说适用于Python2.6 >>> import re >>> r = re.compile(".*(ELF).*") >>

我有一个混合了二进制数据和文本数据的文件。我想通过正则表达式对其进行解析,但出现以下错误:

TypeError:无法在类似字节的对象上使用字符串模式
我猜这条消息意味着Python不想解析二进制文件。 我正在用
“rb”
标志打开文件

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


编辑:我正在使用Python3.2.0

这对我来说适用于Python2.6

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

re.compile
中,需要使用一个
bytes
对象,由初始
b
表示:

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

这就是Python3对字符串和字节之间的区别的挑剔。

我认为您使用的是Python3

1.以二进制模式打开文件很简单,但很微妙。唯一的区别 在文本模式下打开它 模式参数包含一个'b' 性格

4.不过这里有一个区别:二进制流对象没有编码 属性这是有道理的,对吗? 您正在读取(或写入)字节,而不是 字符串,因此没有转换 Python来做

然后,在Python3中,由于来自文件的二进制流是字节流,因此用于分析来自文件的流的正则表达式必须定义为字节序列,而不是字符序列

在Python2中,字符串是 字符编码无效的字节 单独跟踪。如果你愿意 Python 2来跟踪 字符编码,您必须使用 改为Unicode字符串(u“”)。但是在 Python 3,字符串总是什么 Python 2称为Unicode字符串- 也就是说,一个Unicode数组 字符(可能具有不同的字节) 长度)

在Python 3中,所有字符串都是序列 Unicode字符的。没有 比如Python字符串编码 在UTF-8中,或用Python字符串编码 如CP-1252所示。“这是UTF-8字符串吗?”是吗 无效的问题。UTF-8是一种 将字符编码为 字节。如果你想要一根绳子 并将其转换为一个字节序列 在特定的字符编码中, Python3可以帮助您实现这一点

4.6。字符串vs.字节#字节是字节;字符是一种抽象。 Unicode的不可变序列 字符称为字符串。一 不可变序列 介于-0和-255之间的数字称为a 字节对象

1.要定义bytes对象,请使用b''“byte literal”语法。每个字节 在字节文本中,可以是 ASCII字符或编码字符 从\x00到\xff的十六进制数 (0-255)

因此,您将如下定义正则表达式

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

pat = re.compile('[a-f]+\d+')
更多说明如下:


我从您使用的Python 3对类似字节的对象的引用中猜到了,对吗?这段代码
import re;r=重新编译(“(此)”);f=打开(r“C:\WINDOWS\system32\mspaint.exe”、“rb”);x=f.readline();r、 match(x).groups()
返回与我的原始错误相同的错误post@JohnMachin请问你是什么意思?任何合法的正则表达式都有可能将正则表达式与\x00混淆,或者表示二进制数据的任何有效替代方法?我的IDE抱怨我的字节字符串中存在无效的转义序列\d。为什么人们制作的示例总是使用硬编码字符串?如果将正则表达式模式从文本文件读取为纯字符串,而不解释如何将其转换为(兼容的)二进制字符串,那么这一点都没有帮助。如果模式不是在脚本中硬编码的,而是从文本文件读入字符串变量,该怎么办?如何将其转换为(兼容)字节字符串?