Don*_*ter 32 python regex binary parsing python-3.x
我有一个混合二进制数据和文本数据的文件.我想通过正则表达式解析它,但我收到此错误:
TypeError: can't use a string pattern on a bytes-like object
Run Code Online (Sandbox Code Playgroud)
我猜这个消息意味着Python不想解析二进制文件.我正在打开带有"rb"标志的文件.
如何在Python中使用正则表达式解析二进制文件?
编辑:我正在使用Python 3.2.0
Sco*_*ths 31
在re.compile你需要使用一个bytes对象,由初始表示b:
r = re.compile(b"(This)")
Run Code Online (Sandbox Code Playgroud)
这是Python 3对字符串和字节之间的差异挑剔.
eyq*_*uem 28
我认为你使用Python 3.
1.以二进制模式打开文件很简单但很微妙.与在文本模式下打开它的唯一区别是mode参数包含'b' 字符.
........
但是,这是一个区别:二进制流对象没有编码属性.这是有道理的,对吗? 您正在读取(或写入)字节,而不是字符串,因此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字符序列.没有用UTF-8编码的Python字符串或编码为CP-1252的Python字符串."这个字符串是UTF-8吗?"是一个无效的问题.UTF-8是一种将字符编码为字节序列的方法.如果你想获取一个字符串并将其转换为特定字符编码中的字节序列,Python 3可以帮助你.
和
4.6.字符串与字节#字节是字节; 字符是一种抽象.不可变的Unicode字符序列称为字符串.不可变的数字序列 - 介于0和255之间称为字节对象.
....
1. 要定义字节对象,请使用b''"byte literal"语法.字节文字中的每个字节可以是ASCII字符或从\ x00到\ xff(0-255)的编码十六进制数字.
因此,您将按如下方式定义正则表达式
pat = re.compile(b'[a-f]+\d+')
Run Code Online (Sandbox Code Playgroud)
而不是
pat = re.compile('[a-f]+\d+')
Run Code Online (Sandbox Code Playgroud)
更多解释: