【问题标题】:How to find floating point numbers in binary file with Python?如何使用 Python 在二进制文件中查找浮点数?
【发布时间】:2016-08-05 17:14:34
【问题描述】:

我有一个混合了 ASCII 的二进制文件,其中有一些我想查找的浮点数。该文件包含如下几行:

1,1,'11.2','11.3';1,1,'100.4';

在我最喜欢的正则表达式测试器中,我发现正确的正则表达式应该是([0-9]+\.{1}[0-9]+)

代码如下:

import re

data = open('C:\\Users\\Me\\file.bin', 'rb')
pat = re.compile(b'([0-9]+\.{1}[0-9]+)')
print(pat.match(data.read()))

我没有得到一个匹配,这是为什么呢?我在 Python 3.5.1 上。

【问题讨论】:

  • 浮点数是否表示为字符串?
  • 是的,它们是 ASCII 编码的。
  • 什么是与 ASCII 混合的二进制文件,如何识别 ASCII 和二进制部分?在不知道我不能告诉你如何安全地阅读文件的情况下。顺便说一句,您的正则表达式无法匹配 1..5,而不是 1(但对于最后一部分,可能希望失败)
  • @SergeBallesta 对不起,我的意思是 ASCII 和非 ASCII 字符。

标签: python regex python-3.x binary floating-point


【解决方案1】:

你可以这样试试,

import re
with open('C:\\Users\\Me\\file.bin', 'rb') as f:
    data = f.read()

re.findall("\d+\.\d+", data)

输出

['11.2', '11.3', '100.4']

re.findall 返回string 列表。如果你想转换为浮动,你可以这样做

>>> list(map(float, re.findall("\d+\.\d+", data)))
[11.2, 11.3, 100.4]

【讨论】:

  • 不工作,告诉我TypeError: expected string or bytes-like object。它包含二进制的东西。
  • @JohnnyFromBF 你应该试试,re.findall("\d+\.\d+", data.read())
  • 恐怕还是TypeError: cannot use a string pattern on a bytes-like object
  • @JohnnyFromBF,您确定它不是 latin-1 编码文件吗?实际内容是什么样的?试试encoding="latin-1"
  • @PadraicCunningham 原来,文件确实是错误的编码 m(
【解决方案2】:

如何使用 Python 查找二进制文件中的浮点数?

float_re = br"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?"
for m in generate_tokens(r'C:\Users\Me\file.bin', float_re):
    print(float(m.group()))

float_re is from this answergenerate_tokens() is defined here 的位置。


pat.match() 尝试在输入字符串的开头进行匹配,而您的字符串不以浮点数开头,因此您“没有得到一个匹配”


re.findall("\d+\.\d+", data) 产生 TypeError 因为模式是 Unicode (str) 但 data 在您的情况下是 bytes 对象。将模式传递为bytes:
re.findall(b"\d+\.\d+", data)

【讨论】:

  • 您的模式允许在前导符号字符后有一个空格,我认为这是一个错误。例如,“-2.2”不是浮点数,但“-2.2”是。
  • 另外,如果你想真正迂腐,你可以限制允许的指数位数,如果你知道这是一个 32 位还是 64 位浮点值。
  • @SteveHollasch 什么是或不是浮动是定义问题。点击解释正则表达式来源的链接。
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
相关资源
最近更新 更多