使用findall

时间:2017-11-20 15:32:37

标签: python python-3.x

我尝试使用二进制文件的设置文件来了解它是如何被构造的,这样我就可以从中获取有关文件位置等的一些信息。

据我所知,这些有趣的数据要么完全在逃避字符之后,要么接近转义字符b' \ x03 \ SETTING' - 这是一个我对LQ' ...感兴趣的设置的例子。

\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
\x03HTAPp\x00\x00\x00\x02\x02\x00\x00\x01\x02L\x02\x00\x00\x00\x01
\x03LQ\x00\x00\x00\\\\Media\\Render_Drive\\mediafiles\\mxf\\k70255.2\\a08.56d829a7_56d82956d829a0.mxf
\x03HTAPp\\x00\x00\x00\x02\x02\x00\x00\x01\x02L\x02\x00\x00\x00\x01
\x03LQ\x00\x00\x00\\\\Media\\Render_Drive\\mediafiles\\mxf\\k70255.2\\a07.56d829a6_56d82956d829a0.mxf

所以它看起来像每个句子'以\ x03开头 - &我在这里寻找的路径是在LQ设置后的第8个字节' \ x03LQ'

该文件还有我想要捕获的其他设置 - 每次看起来设置都是在转义字符后面,并通过设置的短描述和一些字节来填充。

ATM我正在阅读二进制文件,并且可以找到一条特定的路径(只有,如果我知道它现在有多长时间)

with open(file, "rb") as abin:
            abin.seek(0) 
            data = abin.read()
            foo = re.search(b'\x03LQ', data) 
            abin.seek(foo.start() + 8) # cursor lands on 8th byte
            eg = abin.read(32)
            # so I get the path of some length as eg.....

这不是我想要的,因为我想读取整个bytestring直到下一个转义字符,然后找到下一个发生的设置并读取路径。

我正在尝试使用findall(),但它只返回一个相同的字节对象列表(似乎),而且我不了解如何搜索每个唯一路径&每个字节字符串的实例,并从数据中的某个光标位置读取。例如

bar = re.findall(b'\x03LQ', data)
for bs in bar:
    foo = re.search(bs, data)
    abin.seek(foo.start() + 8)
    eg = abin.read(64)
    print('This is just the same path each time', eg)

指点任何人?

1 个答案:

答案 0 :(得分:1)

关键是要查看findall()的结果,这将是:

[b'\x03LQ', b'\x03LQ', b'\x03LQ', ...]

你只是告诉它找到一个静态字符串,这样它才能返回。为了使结果有用,您可以告诉它取代在给定字符串之后的内容。这是一个示例,它将获取给定字符串之后的所有内容,直到下一个\x03字节为止:

findall(rb'\x03LQ([^\x03]*)', data)

parens告诉findall()你想要的匹配部分,[^\x03]*表示"匹配任何不是\x03"的字节数。您的示例的结果应为:

[b'\x00\x00\x00\\\\Media\\Render_Drive\\mediafiles\\mxf\\k70255.2\\a08.56d829a7_56d82956d829a0.mxf\n', 
 b'\x00\x00\x00\\\\Media\\Render_Drive\\mediafiles\\mxf\\k70255.2\\a07.56d829a6_56d82956d829a0.mxf']