当前位置: 首页 > 面试题库 >

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

东方富
2023-03-14
问题内容

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

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

我猜该消息意味着Python不想解析二进制文件。我正在打开带有"rb"标志的文件。

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

编辑: 我正在使用Python 3.2.0


问题答案:

我认为您使用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字符 序列
。没有诸如以UTF-8编码的Python字符串或以CP-1252编码的Python字符串之类的东西。“这是UTF-8字符串吗?”
是一个无效的问题。UTF-8是一种将字符编码为字节序列的方式。如果您想将字符串转换为特定字符编码的字节序列,Python 3可以帮助您。

http://www.diveintopython3.net/strings.html#boring-
stuff

4.6。字符串与字节数#字节是字节;字符是一种抽象。不变的Unicode字符序列称为字符串。在0到255之间的不变数字序列称为字节对象。

....

  1. 要定义字节对象,请使用b’‘“字节文字”语法 。字节文字中的每个字节可以是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。不能在类似字节的对象上使用字符串模式



 类似资料:
  • Java中的正则表达式问题。我正在从元素href属性中提取Id号。我在一个字符串中有一堆这样的链接:

  • 问题内容: 有什么方法可以在python中的流上使用正则表达式匹配吗?喜欢 而且我不想通过获取整个字符串的值来做到这一点。我想知道是否有任何方法可以在srtream上匹配正则表达式(即时)。 问题答案: 我有同样的问题。首先想到的是实现一个类,该类的作用类似于字符串,但仅从流中读取当前所需的数据(我通过重新实现并提取和缓冲字符直到访问的最高位置来完成此操作……)。 这没有解决(我从中得到了“ Ty

  • 问题内容: 我正在创建一个CSS编辑器,并试图创建一个可以从CSS文档获取数据的正则表达式。如果我拥有一个属性,则此正则表达式有效,但我无法使其对所有属性都有效。我在PHP中使用preg / perl语法。 正则表达式 测试用例 预期结果 实际结果 在此先感谢您的帮助-整个下午使我感到困惑! 问题答案: 对于单个正则表达式来说,这似乎太令人费解了。好吧,我敢肯定,通过正确的扩展,高级用户可以创建正

  • 我试图在正则表达式中组合if-else,基本上,如果字符串中存在一些模式,则捕获一个模式,如果不存在,则捕获另一个模式。 字符串是:'https://www.searchpage.com/searchcompany.aspx?companyId=41490234 因此,如果在字符串中检测到“?”,则正则表达式应捕获“?”标记之后的所有内容;如果没有,那就从头抓起。 我使用了:

  • 问题内容: 我正在寻找一种解析日志文件的解决方案。看起来像: 可以区分以下元素: 但我仍然不知道该怎么做。简单行不通。 我知道正则表达式具有一般规则,但最合适的是Java。 谢谢 问题答案: 我想出了一种根据可能的/期望的值从与各个字段匹配的块中构建正则表达式的方法。 当然,可以用rex代替rexa或rexi。

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?