Python 基于整数字节表示的pyparsing范围解析

Python 基于整数字节表示的pyparsing范围解析,python,python-3.x,pyparsing,Python,Python 3.x,Pyparsing,我想知道pyparsing是否能够解析和检测(以一种简单的方式)几个字节上表示的一系列整数。下面是一段代码,我可以用来解析整数部分,然后对其进行处理(只需使用后面的内容进行打印): 从pyparsing导入* 导入结构 进口稀土 最小值=0x06A1D58C#111 269 260 最大值=0x14B4CB1C#347 _392 _796 行a=b'3F\x09\x21\xe4\xc0KBHDVC' ParseRelation.setDefaultWhitespaceChars(“”) expr

我想知道
pyparsing
是否能够解析和检测(以一种简单的方式)几个字节上表示的一系列整数。下面是一段代码,我可以用来解析整数部分,然后对其进行处理(只需使用后面的内容进行打印):

从pyparsing导入*
导入结构
进口稀土
最小值=0x06A1D58C#111 269 260
最大值=0x14B4CB1C#347 _392 _796
行a=b'3F\x09\x21\xe4\xc0KBHDVC'
ParseRelation.setDefaultWhitespaceChars(“”)
expr=Suppress('3F')+Regex(re.compile(r'.{4}',re.DOTALL)).setResultsName('id')+Word(
srange('[A-Z]')。setResultsName('code'))
expr.parseWithTabs()
尝试:
result=expr.parseString(行_a.decode('latin-1'),parseAll=False)
打印(result.get('id')。encode('latin-1'))
id=struct.unpack('!I',result.get('id')。encode('latin-1'))[0]
code=result.get('code'))

如果min如果希望将此转换和验证作为表达式定义的一部分进行,则可以添加解析时间回调或解析操作:

解析操作可以获取解析的令牌并返回转换或扩充的值

您还可以使用以下解析操作实现类似于范围检查的筛选器:

def in_range(tokens):
    if not (min <= tokens[0] <= max):
        raise ParseException()

很好的例子。然而,在我的情况下,我只需要测试范围,但初始数据需要保持完整。因此,我猜测所有内容都应该在addCondition()内,并且不包含任何addParseAction()。我将尝试让您知道它是如何运行的。我已经创建了以下内容,它似乎正在工作:
def is_in_range(struct_格式:str,minval,maxval):unpack=lambda tokens:struct.unpack(struct_格式,tokens.encode('latin-1'))[0]in_range=lambda x,minval=minval,maxval=maxval:minval
def in_range(tokens):
    if not (min <= tokens[0] <= max):
        raise ParseException()
binary_bytes.addCondition(lambda tokens: min <= tokens[0] <= max)
def make_range_condition(minval, maxval):
    in_range = lambda x, minval=minval, maxval=maxval: minval <= x <= maxval
    return lambda t: in_range(t[0])

binary_bytes = Regex(re.compile(r'.{4}', re.DOTALL))
binary_bytes.addParseAction(lambda tokens: struct.unpack('!I', tokens[0].encode('latin-1'))[0])
binary_bytes.addCondition(make_range_condition(min, max))

ParserElement.setDefaultWhitespaceChars("")
expr = (Suppress('3F')
        + binary_bytes('id')
        + Word(srange('[A-Z]'))('code')
        )
expr.parseWithTabs()

try:
    result = expr.parseString(line_a.decode('latin-1'), parseAll=False)
    print(result.dump())
except ParseException as e:
    print(e.explain(e))
[153216192, 'KBHDVC']
- code: 'KBHDVC'
- id: 153216192