我正在使用python regex解析流式十六进制数据。我有以下数据包结构,我试图从数据包流中提取:
'\xaa\x01\xFF\x44'
我想使用python正则表达式来指示要匹配的数据包的多少数据部分:
r = re.compile('\xaa(?P<length>[\x00-\xFF]{1})(.*){?P<length>}\x44')
这个编译没有错误,但它不起作用。我怀疑它不起作用,因为正则表达式引擎无法将<length>
命名组十六进制值转换为适当的整数,以便在正则表达式{}
表达式中使用。有没有一种方法可以在python中实现,而不需要传播匹配组?
背景:我一直在使用erlang进行数据包解包,我在python中寻找类似的东西
答案 0 :(得分:0)
我最终做了如下的事情:
self.packet_regex = \
re.compile('(\xaa)([\x04-\xFF]{1})([\x00-\xFF]{1})([\x10-\xFF]{1})([\x00-\xFF]*)([\x00-\xFF]{1})(\x44)')
match = self.packet_regex.search(self.buffer)
if match and match.groups():
groups = match.groups()
if (ord(groups[1]) - 4) == len(groups[4]) + len(groups[5]) + len(groups[6]):
...
答案 1 :(得分:-1)
这几乎可以解决你提出的问题。看看吧
import re
orig_str = '\xaa\x01\xFF\x44'
print orig_str
#converting original hex data into its representation form
st = repr(orig_str)
print st
#getting the representation form of regex and removing leading and trailing single quotes
reg = re.compile(repr("(\\xaa)")[1:-1])
p = reg.search(st)
#creating the representation from matched string by adding leading and trailing single quotes
extracted_repr = "\'"+p.group(1)+"\'"
print extracted_repr
#evaluating the matched string to get the original hex information
extracted_str = eval(extracted_repr)
print extracted_str
>>>
��D
'\xaa\x01\xffD'
'\xaa'
�