私は数日間これに頭をぶつけてきて、さまざまなアプローチを試しましたが、どれも私が使用できる方法で機能していないようです...
問題。
任意のバイトストリームが与えられます。バイトに埋め込まれたいくつかのセマンティック要素があります。中かっこ、角かっこ、かっこがあります。これらは3つの異なることを示しています-{}はノーです。バイト範囲の例:{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)