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

如何使用Python在二进制文件中查找浮点数?,python,regex,python-3.x,binary,floating-point,Python,Regex,Python 3.x,Binary,Floating Point,我有一个混合了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(

我有一个混合了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。

您可以这样尝试

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

re.findall("\d+\.\d+", data)
输出:

re.findall返回字符串列表。如果你想转换成float,你可以这样做

>>> list(map(float, re.findall("\d+\.\d+", data)))
[11.2, 11.3, 100.4]
你可以这样试试

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

re.findall("\d+\.\d+", data)
输出:

re.findall返回字符串列表。如果你想转换成float,你可以这样做

>>> list(map(float, re.findall("\d+\.\d+", data)))
[11.2, 11.3, 100.4]
如何使用Python在二进制文件中查找浮点数

地点和地点

pat.match尝试在输入字符串的最开头进行匹配,而您的字符串不是以浮点开头的,因此您不会得到任何匹配

关于.findall\d+\.\d+,数据生成TypeError,因为模式是Unicode str,但在您的案例中,数据是字节对象。以字节形式传递模式: 关于findallb\d+\.\d+,数据

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

地点和地点

pat.match尝试在输入字符串的最开头进行匹配,而您的字符串不是以浮点开头的,因此您不会得到任何匹配

关于.findall\d+\.\d+,数据生成TypeError,因为模式是Unicode str,但在您的案例中,数据是字节对象。以字节形式传递模式:

re.findallb\d+\.\d+,data

浮点数是否表示为字符串?是的,它们是ASCII编码的。什么是混合了ASCII的二进制文件?如何识别ASCII和二进制部分?在不知道的情况下,我无法告诉您如何安全地阅读该文件。顺便说一句,您的正则表达式无法匹配1、.5,更不用说1了,但对于最后一部分,可能需要fail@SergeBallesta对不起,我指的是ASCII和非ASCII字符。浮点数是否表示为字符串?是的,它们是ASCII编码的。什么是ASCII混合的二进制文件?如何识别ASCII和二进制部分?在不知道的情况下,我无法告诉您如何安全地阅读该文件。顺便说一句,您的正则表达式无法匹配1、.5,更不用说1了,但对于最后一部分,可能需要fail@SergeBallesta对不起,我指的是ASCII和非ASCII字符。不起作用,告诉我TypeError:预期的字符串或字节类似于对象。它包含二进制内容。@JohnnyFromBF您应该试试,re.findall\d+\.\d+,data.read。恐怕它仍然说TypeError:不能在类似字节的对象上使用字符串模式。@JohnnyFromBF,您确定它不是拉丁语编码的文件吗?实际内容是什么样的?尝试编码=拉丁语-1@PadraicCunningham事实证明,该文件确实是在一个错误的编码mNot工作,告诉我TypeError:预期字符串或字节类对象。它包含二进制内容。@JohnnyFromBF您应该试试,re.findall\d+\.\d+,data.read。恐怕它仍然说TypeError:不能在类似字节的对象上使用字符串模式。@JohnnyFromBF,您确定它不是拉丁语编码的文件吗?实际内容是什么样的?尝试编码=拉丁语-1@PadraicCunningham事实证明,文件的编码确实是错误的。mYour模式允许在前导符号字符后留一个空格,我认为这是一个错误。例如,-2.2不是浮点数,但-2.2是。此外,如果你想真正学究,你可以限制允许的指数位数,如果你知道这是32位还是64位的浮点值。@SteveHollasch什么是浮点数还是不是浮点数是一个定义问题。按照解释正则表达式起源的链接进行操作。您的模式允许在前导符号字符后留有空格,我认为这是一个错误。例如,-2.2不是浮点数,但-2.2是。此外,如果你想真正学究,你可以限制允许的指数位数,如果你知道这是32位还是64位的浮点值。@SteveHollasch什么是浮点数还是不是浮点数是一个定义问题。遵循解释正则表达式起源的链接。