我一直对此感到头撞了两天,尝试了各种方法,它们中的任何一个都不能以我可以使用的方式工作...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)
我没有足够的upvotes。太优雅了!谢谢。 – 2013-02-18 23:44:49
不客气。 – Hyperboreus 2013-02-18 23:45:25