python正则表达式使用捕获组来定义另一个组长度{}

时间:2015-06-28 04:29:57

标签: python regex hex

我正在使用python regex解析流式十六进制数据。我有以下数据包结构,我试图从数据包流中提取:

'\xaa\x01\xFF\x44'
  • \ xaa - 数据包开始
  • \ x01 - 数据长度[值可以在00-FF之间变化]
  • \ xFF - 数据
  • \ x44 - 数据包结束

我想使用python正则表达式来指示要匹配的数据包的多少数据部分:

r = re.compile('\xaa(?P<length>[\x00-\xFF]{1})(.*){?P<length>}\x44')

这个编译没有错误,但它不起作用。我怀疑它不起作用,因为正则表达式引擎无法将<length>命名组十六进制值转换为适当的整数,以便在正则表达式{}表达式中使用。有没有一种方法可以在python中实现,而不需要传播匹配组?

背景:我一直在使用erlang进行数据包解包,我在python中寻找类似的东西

2 个答案:

答案 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'
    �