对二进制文件中的文本块执行RegEx替换

时间:2017-06-30 18:16:57

标签: python regex

我有一个包含文本和二进制代码的文件。为了让Python处理它,我必须将它作为二进制文件加载,这是有道理的。

现在,问题是,一旦我这样做,我就不能使用常规的RegEx而没有我目前无法理解的一些变化。

我希望代码如下所示,但事实证明并非如此。

#!/usr/bin/env python

import re

s = open('./source.data', 'rb')
d = open('./dest.data', 'wb')

f = "REPEATED_TEXT_STRING"

c = s.read()

r = "^\d+ \d+ obj$(?:(?!^\d+ \d+ obj$)[\s\S])*?" + f + "[\s\S]+?^endobj$"

r = re.compile(r, re.DOTALL | re.MULTILINE)
t = r.sub('', c)

d.write(t)

我知道r变量需要被标记为二进制字符串,在开头有一个'b',但遗憾的是它并不像我想要做的那样简单。

1 个答案:

答案 0 :(得分:1)

re module documentation州:

  

要搜索的模式和字符串都可以是Unicode字符串以及8位字符串。但是,不能混合Unicode字符串和8位字符串:也就是说,您不能将Unicode字符串与字节模式匹配,反之亦然;同样,当要求替换时,替换字符串必须与模式和搜索字符串的类型相同。

这意味着如果c是一个字节对象,那么r和替换字符串也必须是:

f = b"REPEATED_TEXT_STRING"

c = s.read()

r = b"^\d+ \d+ obj$(?:(?!^\d+ \d+ obj$)[\s\S])*?" + f + b"[\s\S]+?^endobj$"

r = re.compile(r, re.DOTALL | re.MULTILINE)
t = r.sub(b'', c)

我忘记了fr的另一半。它们也需要是字节。