2015-06-28 30 views
4

我用python正則表達式解析流十六進制數據。我有我試圖從分組流中提取以下的分組結構:python正則表達式使用捕獲組來定義另一個組長度{}

'\xaa\x01\xFF\x44' 
  • \的Xaa - 分組的開始
  • \ X01 - 數據長度[值可以從00-FF變化]
  • \ XFF - 數據
  • \ X44 - 包結束

我想使用正則表達式蟒指示多少數據包的數據部分,以匹配這樣:

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

這個編譯沒有錯誤,但它不工作。我懷疑它不工作,因爲它的正則表達式引擎不能將<length>命名的組十六進制值轉換爲正則表達式{}表達式中使用的適當整數。有沒有一種方法可以用python完成,而不需要傳播比賽組?

背景:我一直在使用Erlang的數據包拆包,我一直在尋找蟒蛇

+0

如果您確定該點的數據包結構'\ x44'結束,你能逃脫使用'\ xaa。(。*?)\ x44'?還是有可能在數據包的有效載荷中遇到'\ x44'? –

+0

這是一個在串行接口上​​運行的流式協議。我可能會收到超過1個數據包或1.5個數據包的讀取數據。考慮到這一點,我必須驗證匹配的內容是數據包的真實性。只是匹配的開始和結束塊是不夠的,因爲數據本身可能包括\ xaa,\ x44 bytes – user2163865

+0

在這種情況下,我認爲正則表達式不是您的答案。我會構建一些使用'deque'的東西,讓新的傳入數據包對其進行擴展,然後從中檢索消費者(可能會進行一些基於狀態的解析,具體取決於傳入流的複雜程度)。 –

回答

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]): 
     ... 
+0

這種方法似乎有一些缺陷;例如取一個字符串'\ xAA \ x08 \ xFF \ x22 \ xDA \ x44 \ xEE \ xFC \ xAB \ xAD \ x44 \ xEE' - 它會返回'\ xdaD \ xee \ xfc \ xab',即使數據包長度應該是8.它也不會傷害顯示其餘的代碼(在最後一條if語句之後)。 –

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