2013-02-18 63 views
2

我一直對此感到頭撞了兩天,嘗試了各種方法,它們中的任何一個都不能以我可以使用的方式工作...Python - 基於類型將結構過濾爲結構

問題。

我給了一個任意的字節流。在字節中有一些語義元素。有大括號,方括號和括號。這些表明了三個不同的事情 - {}是一個不。的字節範圍,例如{17}是17個字節。 []是一個字節值,例如[90:95]是字節x90,x91,x92,x93,x94,x95。 ()是字節值'OR'選項,例如(46 | 47)表示x46或x47。

還有其他的語法結構,我必須檢測,「!」,「*」,「?」和「:」。

一個例子字節流:524946(46 | 58){4} 434452367672736E

我試圖對其進行過濾,所以我得到這樣的:

1 string 524946 
2 token (46|58) 
3 token {4} 
4 string 434452367672736E 

一旦我把它拆了,然後我可以進一步處理它。

我來得到它的工作(其醜陋難看醜陋的代碼......)最近的:http://pastebin.com/XLg2H0PW

我與一些正則表達式試過,但我能得到它不算語法單位裏面的字節串作爲普通的字符串元素:

range_masks_list = [(m_mask1.span()) for m_mask1 in re.finditer("\{([0-9]+|[0-9]+-[0-9]+|[0-9]+-\*)\}",sequence)] ## looks for {int}, {int-int} and {int-*} 
byte_masks_list = [(m_mask2.span()) for m_mask2 in re.finditer("\[[a-fA-F0-9]{2}:[a-fA-F0-9]{2}]",sequence)] ## looks for [a:b] where a and b are byte ranges 
options_sets_list = [(m_mask3.span()) for m_mask3 in re.finditer("\(([a-fA-F0-9]{2})+\|([a-fA-F0-9]{2})+(\|([a-fA-F0-9]{2})+)*\)",sequence)] ## looks for regex or clauses e.g. (a|b) 
string_chunk_list = [(m_mask4.span()) for m_mask4 in re.finditer("([a-fA-F0-9]{2})+",sequence)] ## looks for uninterrupted hex byte spans 

這將是這樣的:

def do_fragmenter(self,sequence): 
    """ converts the grep grammer normalised string into a set of fragments and offsets for sig population""" 
    sequence = sequence.replace(" ","") 
    range_masks_list = [(m_mask1.span()) for m_mask1 in re.finditer("\{([0-9]+|[0-9]+-[0-9]+|[0-9]+-\*)\}",sequence)] ## looks for {int}, {int-int} and {int-*} 
    byte_masks_list = [(m_mask2.span()) for m_mask2 in re.finditer("\[[a-fA-F0-9]{2}:[a-fA-F0-9]{2}]",sequence)] ## looks for [a:b] where a and b are byte ranges 
    options_sets_list = [(m_mask3.span()) for m_mask3 in re.finditer("\(([a-fA-F0-9]{2})+\|([a-fA-F0-9]{2})+(\|([a-fA-F0-9]{2})+)*\)",sequence)] ## looks for regex or clauses e.g. (a|b) 
    string_chunk_list = [(m_mask4.span()) for m_mask4 in re.finditer("([a-fA-F0-9]{2})+",sequence)] ## looks for uninterupted hex byte spans 
    string_chunks = [] 
    string_chunks_len = [] 
    for pair in string_chunk_list: 
     string_chunks.append(sequence[pair[0]:pair[1]]) 
     string_chunks_len.append(len(sequence[pair[0]:pair[1]])) 
    print zip(string_chunks,string_chunks_len) 

回答

1

只是考慮到你所定義的語法元素,你也許可以用這樣的事情(用您所需要的處理打印):

#! /usr/bin/python3.2 

import re 

a = '524946(46|58){4}434452[22:33]367672736E' 
patterns = [ ('([0-9a-fA-F]+)', 'Sequence '), 
    ('(\\([0-9a-fA-F]+\\|[0-9a-fA-F]+\\))', 'Option '), 
    ('({[0-9a-fA-F]+})', 'Curly '), 
    ('(\\[[0-9a-fA-F]+:[0-9a-fA-F]+\\])', 'Slice ') ] 

while a: 
    found = False 
    for pattern, name in patterns: 
     m = re.match (pattern, a) 
     if m: 
      m = m.groups() [0] 
      print (name + m) 
      a = a [len (m):] 
      found = True 
      break 
    if not found: raise Exception ('Unrecognized sequence') 

產量:

Sequence 524946 
Option (46|58) 
Curly {4} 
Sequence 434452 
Slice [22:33] 
Sequence 367672736E 
+0

我沒有足夠的upvotes。太優雅了!謝謝。 – 2013-02-18 23:44:49

+0

不客氣。 – Hyperboreus 2013-02-18 23:45:25