2012-04-27 11 views
3

与えられた例をエミュレートしようとしても、このスクリプトでsetResultsNameが動作するのに問題があります。私はドキュメントを見て、著者の本を調べ、フォーラムの例を見てきました。私はいくつかのバリエーションを試してきましたが、私は間違っています。コードのこの部分が何しようとしている何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を動作させることができたら、私は設定される可能性があります。

答えて

1

トークンに対して、ないパーサ表現に対して、このようなあなたのパース行動に解析されたトークンを渡して、アクセス結果名:setParseActionforwardを使用して

def new_line(tokens): 
    return '\n' + tokens.responsenumber 
+0

ありがとう、ポール。あなたのモジュールで私の歯を切って申し訳ありません。 提案する変更を行うと、\ nは表示されますが、lineIDは表示されません。あなたはちょうど私に手がかりを与えていましたか、今私は望みの結果を得るべきですか? –

+2

ちょっと手掛かり - new_lineの始めにこの行を追加してください: 'print tokens.dump()' 'Group'のためにネストするレベルがあると思います。もしそうなら' tokens [0] .responsenumber'代わりに。実際には、あなたの文法は実際には複雑すぎるようですが、私は再帰的なForward定義の理由を見ません。 – PaulMcG

+0

私がここに持っているサンプルデータは、文法が解析しなければならないものよりはるかに単純です。私は焦点を私が持っている問題になるようにここで簡略化しました。あなたは実際に私が最近尋ねた質問で文法を定式化するのを手助けしました:http://stackoverflow.com/questions/10234387/difficulty-of-this-particular-job-using-pyparsing-beginner 私はトークンを印刷します。 dump() 'それは私にセミコロンを与えるだけで、それが動作しているトークンを私に与えるなら意味があります。私が実際に望んでいたのは、元素の重量を使った化学式の例で行ったことを反映したものです。 –

1

は(私の頭が痛くを作ることができ、両方のものですそれは私がそれを見て次にコードを読むことができないことを知っている方法です)。

あなたが記述したところでは、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) 
+0

ありがとう、フィル。それは有り難いです! –

関連する問題