[英]Python Regular Expression Extract Chunk of Data From Binary File
我有一个二进制文件。 从该文件中,我需要使用python正则表达式提取少量数据。
我需要提取在空字符集之间存在的非空字符集。
例如,这是主要字符集:
\\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ XFF \\ XFE \\ XFE \\ X00 \\ X00 \\ X23 \\ X41 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X41 \\ X49 \\ X57 \\ X00 \\ X00 \\ X00 \\ X00 \\ X32 \\ X41 \\ X49 \\ X57 \\ X00 \\ X00 \\ X00 \\ X00 \\ X32 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X00 \\ X56 \\ X65 \\ X00 \\ X35 \\ X56
正则表达式应从上述主集中提取以下字符集:
\\ xff \\ xfe \\ xfe \\ x00 \\ x00 \\ x23 \\ x41,\\ x41 \\ x49 \\ x57 \\ x00 \\ x00 \\ x00 \\ x00 \\ x32 \\ x41 \\ x49 \\ x57 \\ x00 \\ x00 \\ x00 \\ x00 \\ x00 \\ x32和\\ x56 \\ X65 \\ X00 \\ X35 \\ X56
重要的是,如果连续获得5个以上的空字节,则仅应将这些空字符设置为分隔符。否则,应将此空字节包括在非空字符中。 在给定的示例中您可以看到,提取的字符集中也几乎没有空字符。
如果没有任何意义,请告诉我,我将尝试以更好的方式进行解释。
提前致谢,
您可以将split和lstrip用于列表推导,如下所示:
s='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\xfe\x00\x00\x23\x41\x00\x00\x00\x00\x00\x00\x00\x00\x41\x49\x57\x00\x00\x00\x00\x32\x41\x49\x57\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x65\x00\x35\x56'
sp=s.split('\x00\x00\x00\x00\x00')
print [i.lstrip('\x00\\') for i in sp if i != ""]
输出:
['\xff\xfe\xfe\x00\x00#A', 'AIW\x00\x00\x00\x002AIW\x00\x00\x00\x002', 'Ve\x005V']
您可以分割为\\x00{5,}
这是5个或更多的零。 它是您指定的分度。
在Perl中,它是这样的
Perl测试用例
$strLangs = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\xfe\x00\x00\x23\x41\x00\x00\x00\x00\x00\x00\x00\x00\x41\x49\x57\x00\x00\x00\x00\x32\x41\x49\x57\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x65\x00\x35\x56";
# Remove leading zero's (5 or more)
$strLangs =~ s/^\x00{5,}//;
# Split on 5 or more 0's
@Alllangs = split /\x00{5,}/, $strLangs;
# Print each language characters
foreach $lang (@Alllangs)
{
print "<";
for ( split //, $lang ) {
printf( "%x,", ord($_));
}
print ">\n";
}
输出>>
<ff,fe,fe,0,0,23,41,>
<41,49,57,0,0,0,0,32,41,49,57,0,0,0,0,32,>
<56,65,0,35,56,>
这是在Python中进行操作的方法。 我必须关闭str.strip()
并在前导和尾随null处获取正则表达式模式,以防止在re.split()
返回的结果列表的开头包含额外的空字符串。
import re
data = ('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\xfe\x00\x00\x23\x41'
'\x00\x00\x00\x00\x00\x00\x00\x00\x41\x49\x57\x00\x00\x00\x00\x32\x41'
'\x49\x57\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x00\x00\x00\x00\x00\x56\x65\x00\x35\x56'
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
chunks = re.split(r'\000{6,}', data.strip('\x00'))
# display results
print ',\n'.join(''.join('\\x'+ch.encode('hex_codec') for ch in chunk)
for chunk in chunks),
输出:
\xff\xfe\xfe\x00\x00\x23\x41,
\x41\x49\x57\x00\x00\x00\x00\x32\x41\x49\x57\x00\x00\x00\x00\x32,
\x56\x65\x00\x35\x56
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.