如何用Python正则表达式分割含固定1/2/4字节、可变第三字节的前导码字节串
解决Python字节串按特定可变前导码分割的问题
你的问题出在正则表达式的写法上:\d{2}是匹配两个ASCII数字字符(比如字节b'12'),但你要匹配的是单个可变字节(比如\x12、\x66这种十六进制表示的单字节值),这完全是两回事。
正确的正则模式
要匹配「\xde\x00开头,第三字节任意,第四字节\x74」的前导码,应该用[\x00-\xff]来表示任意单个字节(覆盖所有可能的8位字节值),完整代码示例如下:
import re string = b'\xde\x00\x12\x74hbcoawnxasnokcasnlawnmclkasmlfmapodmaw\xde\x00\x66\x74dawnioxhawondajncoianoineaopcmaopscamp\xde\x00\x98\x74dawxaskaodjopawnxkpancokaenjocnaocnawo' # 正确模式:固定前两字节 + 任意单字节 + 固定最后一字节 string_split = re.split(rb'\xde\x00[\x00-\xff]\x74', string) print(string_split)
运行后会得到分割结果:
[b'', b'hbcoawnxasnokcasnlawnmclkasmlfmapodmaw', b'dawnioxhawondajncoianoineaopcmaopscamp', b'dawxaskaodjopawnxkpancokaenjocnaocnawo']
第一个空字符串是因为原字节串开头就匹配到了前导码,这是re.split的正常行为。
可选:保留分隔符
如果需要把分割用的前导码也保留在结果里,可以给正则模式加上捕获组:
string_split_with_sep = re.split(rb'(\xde\x00[\x00-\xff]\x74)', string) print(string_split_with_sep)
结果会变成:
[b'', b'\xde\x00\x12t', b'hbcoawnxasnokcasnlawnmclkasmlfmapodmaw', b'\xde\x00ft', b'dawnioxhawondajncoianoineaopcmaopscamp', b'\xde\x00\x98t', b'dawxaskaodjopawnxkpancokaenjocnaocnawo']
补充说明
如果你的第三字节不是完全任意,而是有特定范围(比如只匹配0x10到0x9F之间的字节),可以把[\x00-\xff]换成对应的范围,比如[\x10-\x9F]。
内容的提问来源于stack exchange,提问作者SALAVOZ
相关产品推荐
相关产品推荐

