5

最近、python/pyparsing を使用して 16 進値の文字列を処理し始めましたが、これに問題があります。次の文字列を検討してください。

string = "10020304059917368584304025326"

私は最終結果がこれであることを望みます:

['10', '02', '03', ['04', '05', '9917365843'], ['04', '02', '5326']]

04 がデータを意味するタグ (ASN.1 と同じ概念) であり、05 がそのデータのサイズであるとします。pyparsing コードでサイズ変数を使用する方法がわかりません。私ができる最善のことは次のとおりです。

byte = Word(hexnums, exact=2)
process = byte + byte + byte + Word(hexnums)
newstring = process.parseString(string)
print (newstring.dump())

どんな助けでも大歓迎です。


PS:Hookedの助けを借りて、私の最終的なコードは次のとおりです。

from pyparsing import *

string = "10 02 03 04 05 99 17 36 58 43 04 02 53 26"

tag = Word(hexnums, exact=2)
size =  Word(hexnums)
array = Group(tag + countedArray(size))

process = tag + tag + tag + ZeroOrMore(array)

newstring = process.parseString(string)
print (newstring.dump())

どちらが印刷されますか:

['10', '02', '03', ['04', ['99', '17', '36', '58', '43']], ['04', ['53', '26']]]

これが将来役立つことを願っています。

4

2 に答える 2

2

より一般的な意味で同じ質問をしました。BNF はフォワード消費を処理できますか? . その質問への答えはノーでした。文脈自由文法は何が起こるかを知ることができないからです。ありがたいことに、パッケージの作成者が指摘しているように、pyparsing は文脈自由文法以上のものです。

Pyparsing には、countedArrayあなたが求めることを正確に行うヘルパーが含まれています。単一の引数 expr を取り、整数の後に expr の「n」個のインスタンスが続くものを解析します。

彼の回答には、最小限の実例を含むはるかに完全なソリューションが提供されています。質問: PyParsing の先読みと貪欲な式も、あなたがやろうとしていることの良い参考になります。

于 2012-06-20T04:37:56.080 に答える
0

これは機能しますか?pyparsing は使用しませんが、'04' を見たときに可変長のサブリストを記録します。

def func( s ):
    d = []
    # while s isn't empty
    while len(s) != 0:
        b = s[0:2]
        if b != '04':
            # if b isn't '04' append it to d
            d.append( b )   
            # shorten s
            s = s[2:]
        else:
            # take the length, as a string
            l = s[2:4]
            # take the length, as an integer
            n = int(s[2:4])
            # record b='04', the length, and then the next values
            d.append( [ b, l, s[4:4+n*2] ] )
            # shorten s
            s = s[4+n*2:]
    return d
于 2012-06-19T16:11:01.333 に答える