Python将基于类型的字符过滤到结构中

2024-04-20 06:07:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用我的头撞了这几天,尝试了各种各样的方法,它们似乎没有一个工作的方式,我可以使用。。。你知道吗

问题。你知道吗

我得到一个任意字节流。字节中隐藏着一些语义元素。有花括号、方括号和方括号。这表明了三个不同的东西-{}是一个字节数范围,例如,{17}是17个字节。[]是字节值,例如,[90:95]是字节x90、x91、x92、x93、x94、x95。()是字节值“或”选项,例如(46 | 47)表示x46或x47。你知道吗

还有其他语法结构,我必须检测,“!”, "*", "?" 和“:”。你知道吗

例如bytestream: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) 

Tags: inreforstring字节bytechunkslist
1条回答
网友
1楼 · 发布于 2024-04-20 06:07:08

考虑到你定义的语法元素,你可以使用这样的方法(用你需要的处理替换打印):

#! /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

相关问题 更多 >