我有一个包含文本和二进制代码的文件。为了让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',但遗憾的是它并不像我想要做的那样简单。
答案 0 :(得分:1)
要搜索的模式和字符串都可以是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)
我忘记了f
和r
的另一半。它们也需要是字节。