2013-02-18 2 views
2

나는 며칠 동안 내 머리를 두들겨 다녔고, 다양한 접근법을 시도했지만, 그 중 아무 것도 내가 사용할 수있는 방식으로 작동하지 않는 것 같습니다 ...파이썬 - 타입을 구조체에 기반한 필터 숯불

문제.

임의의 바이트 스트림이 제공됩니다. 이 바이트에는 몇 가지 의미있는 요소가 있습니다. 중괄호, 대괄호 및 대괄호가 있습니다. 이것들은 세 가지 다른 것을 나타냅니다 - {}는 아니오입니다. 바이트 범위 (예 : {17}은 17 바이트입니다. []는 바이트 값입니다 (예 : [90:95]는 바이트 x90, x91, x92, x93, x94, x95입니다.()는 바이트 값 'OR'옵션입니다. (46 | 47)은 x46 또는 x47을 의미합니다.

"!", "*", "?"등의 문법적 구성이 있습니다. 및 ":".

의 예 바이트 스트림 : 524,946 (46 | 58) {4} 434452367672736E

내가 그것을 필터링하기 위해 노력하고있어, 그래서 뭔가 얻을 : 나는 그것을 분할 일단

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

을, 그런 다음 더 처리 할 수 ​​있습니다.

의 I 그것 (그 추한 추한 추한 코드 ...) 일을 얻기에 온 가장 가까운 : 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가 없습니다. 매우 우아한! 고맙습니다. –

+0

당신은 오신 것을 환영합니다. – Hyperboreus