在pyparsing中使用“setResultsName”复制命名字段

时间:2012-06-25 10:49:19

标签: python-3.x pyparsing

我正在使用pyparsing来解码一些帧,但是解码的输出显示了一些重复的结果,我还没有弄明白为什么。这是我得到的一个例子:

from pyparsing import *

def __Array__(s,l,t):
    n = int(t[0],16)
    buf << (n * asn1)

asn1 =      Forward()
buf =       Forward()

array =     Word(hexnums, exact=2).setParseAction(__Array__) + buf

asn1 <<     ( (Literal("01") + array).setResultsName("Array") \
            | (Literal("02") + Word(hexnums, exact=8)).setResultsName("Variable 1") \
            | (Literal("03") + Word(hexnums, exact=2)).setResultsName("Variable 2") )

structX =   Literal("C1").setResultsName("tag1") \
            + Literal("D1").setResultsName("tag2") \
            + Literal("E1").setResultsName("tag3") \
            + Literal("F1").setResultsName("tag4") \
            + asn1

structY =   Literal("C2").setResultsName("tag5") \
            + Literal("D2").setResultsName("tag6") \
            + Literal("F2").setResultsName("tag7") \
            + asn1

structZ =   Literal("C3").setResultsName("tag8") \
            + Literal("D3").setResultsName("tag9") \
            + asn1

header21 =  Literal("D1").setResultsName("header211") + structX \
            | Literal("D2").setResultsName("header212") + structY \
            | Literal("D3").setResultsName("header213") + structZ

header22 =  Literal("E1").setResultsName("header221") + structX \
            | Literal("E2").setResultsName("header222") + structY

header23 =  Literal("F1").setResultsName("header231") + structZ

header =    Literal("AA").setResultsName("header11") + header21 \
            | Literal("BB").setResultsName("header12") + header22 \
            | Literal("CC").setResultsName("header13") + header23

frame = "AA D1 C1 D1 E1 F1 01 02 02 00 00 00 00 03 00"
frame = frame.strip('').replace(' ','')

res = header.parseString(frame)
print(res.dump())

框架结构如下:

AA          -- One of multiple tags : header11
    D1      -- One of multiple tags : header21
        C1      -- StructX - tag1
        D1      -- StructX - tag2
        E1      -- StructX - tag3
        F1      -- StructX - tag4  
                -- asn1 part --   
            01          -- Array
            02
                02          -- Variable 1
                    00 00 00 00 
                03          -- Variable 2
                    00

我得到的输出是:

['AA', 'D1', 'C1', 'D1', 'E1', 'F1', '01', '02', '02', '00000000', '03', '00']
- Array: ['01', '02', '02', '00000000', '03', '00']
  - Variable 1: ['02', '00000000']
  - Variable 2: ['03', '00']
- Variable 1: ['02', '00000000']
- Variable 2: ['03', '00']
- header11: AA
- header211: D1
- tag1: C1
- tag2: D1
- tag3: E1
- tag4: F1

但我想要的是:

['AA', 'D1', 'C1', 'D1', 'E1', 'F1', '01', '02', '02', '00000000', '03', '00']
- Array: ['01', '02', '02', '00000000', '03', '00']
  - Variable 1: ['02', '00000000']
  - Variable 2: ['03', '00']
- header11: AA
- header211: D1
- tag1: C1
- tag2: D1
- tag3: E1
- tag4: F1

有谁知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

变化:

asn1 <<     ( (Literal("01") + array).setResultsName("Array") \
            | (Literal("02") + Word(hexnums, exact=8)).setResultsName("Variable 1") \
            | (Literal("03") + Word(hexnums, exact=2)).setResultsName("Variable 2") )

为:

asn1 <<     ( Group(Literal("01") + array).setResultsName("Array") \
            | (Literal("02") + Word(hexnums, exact=8)).setResultsName("Variable 1") \
            | (Literal("03") + Word(hexnums, exact=2)).setResultsName("Variable 2") )

Group做两件事:它在返回的ParseResults中创建一个子结构,并且它隔离嵌套解析器中定义的任何结果名称。