2016-04-05 5 views
2

私は、次のような行を解析するために設定され、単純なデータがあります。次のように私は上から必要なデータだけがあるPyParsing:すべてのリテラルをグローバルに抑制することはできますか?

R1 (a/30) to R2 (b/30), metric 30 

を:

R1, a, 30, R2, 192.168.0.2, 30, 30 

私は簡単にこのすべてを解析することができますpyparsingを使用していますが、出力にリテラルがたくさんあるか、構文解析の文法でLiteral(thing).suppress()と具体的に言わなければなりません。

Word(alphanums) + '(' + Word(alphanums) + '/' + Word(nums) + ... etc. 

をリテラルトークンが無視されますがあります。

理想的には、私のような上記のための文法を書きたいと思います。 .suppressAllLiterals()のような言い方はできますか?

注:

  • 新しいはPyParsing
  • に私は、ドキュメントを読んで、5つのまたは6例
  • おかげグーグル

検索しました!

答えて

2

あなたはParserElementに、このメソッドを使用することができます - pyparsingをインポートした後、すぐにそれを呼び出す:

from pyparsing import ...whatever... 
ParserElement.inlineLiteralsUsing(Suppress) 

今すぐあなたのパーサ内のすべての文字列リテラルはSuppressオブジェクトに包まれ、その結果から除外されるのではなく、デフォルトはLiteralです。

(私は後方互換性を破ることができたときに、私はおそらく、いつの日か、このV3.0のデフォルトになります。)

+1

こんにちは@Paul、応答に感謝します!私はこれを試しました - それはインラインで使用されている文字列(例えば 'pp.Word(...)+ 'somestring' + pp.Word(...)')で動作しているようです。 この小さな変更は、文法の明快さに多大な助けとなりました。時間をとっていただきありがとうございます。大変感謝しています。 –

+0

もちろん(もちろん、私は "myestring"を "myLiteral"に置き換えた場合には、pp.Literalとしてトークン化されました。 – PaulMcG

+0

抑制されたリテラルを 'Suppress(" blah ")'を使って作成することもできますし、Suppressクラスはリテラルを作成することもできます。あなたは – PaulMcG

関連する問題