3

与えられた例をエミュレートしようとしても、このスクリプトでsetResultsNameを機能させるのに問題があります。私はドキュメントを調べ、著者の本を調べ、フォーラムの例を見てきました。私はいくつかのバリエーションを試しましたが、率直に言って少し困惑していますが、これはあまり経験がないので、間違っていることがあると確信しています。

from pyparsing import *

lineId = Word(nums)
topicString = Word(alphanums+'-'+' '+"'")
expr = Forward()
full_entry = Group(lineId('responsenumber') + expr)

def new_line():
    return '\n' + lineId.responsenumber # <-- here is the line that causes the error

expr << topicString + Optional(nestedExpr(content=delimitedList(expr))) + Optional((Literal(';').setParseAction(new_line) + expr))


for line in input:
    inputParseResults = delimitedList(full_entry).parseString(line).asList()
    print inputParseResults

コードのこの部分が行おうとしているのは、次の入力を取得することです。

1768    dummy data; things
27483   other things

そして、セミコロンで行を分割し、lineIdを再度アタッチしてから、次の行に表示されているように再関連付けします。

1768    dummy data
1768    things
27483   other things

ここに示していない出力のフォーマットを処理する他のコードがあります。私の主な障害は改行+lineIdを取得することであり、setResultsNameを機能させることができれば、設定される可能性があると思います。

4

2 に答える 2

1

解析されたトークンを次のように解析アクションに渡し、パーサー式ではなく、トークンに対して結果名にアクセスします。

def new_line(tokens): 
    return '\n' + tokens.responsenumber
于 2012-04-27T21:51:20.863 に答える
1

とを使用するsetParseActionforward、頭が痛くなる可能性があります(これにより、次にコードを見るときにコードが読み取れなくなることがわかります)。

あなたが説明したことに対して、delimitedListは良い選択でした。他の魔法の解析アクションが本当に必要でない限り、次のようにしてください。

from pyparsing import *

topicParser = Word(nums)("line") + \
              delimitedList(Word(alphanums+'-'+' '+"'"),';')("list")

for line in input:
    topics = topicParser.parseString(line)
    lineid = topics['line']
    for topic in topics['list']:
        print "{0} {1}".format(lineid,topic)
于 2012-04-27T22:34:06.353 に答える