この解析アクションを NUMBER に追加:
NUMBER.setParseAction(lambda locn,tokens: (locn,tokens[0]))
解析アクションには、特定の式について解析されたトークン、解析の場所、および元の文字列を渡すことができます。setParseAction
次のシグネチャのいずれかで関数を渡すことができます。
fn()
fn(tokens)
fn(locn,tokens)
fn(srctring,locn,tokens)
ニーズに合わせて必要なのは、場所と解析されたトークンだけです。
この解析アクションを追加すると、解析結果は次のようになります。
[(0, '1'), (2, '2'), (4, '34')]
編集:
この投稿に対する最初の回答以来、ヘルパーの pyparse を追加しました。locatedExpr
これにより、特定の式の開始位置と終了位置の両方が得られます。これは次のように簡単に記述できます。
NUMBER = locatedExpr(Word(nums))
完全なスクリプト/出力は次のとおりです。
>>> from pyparsing import *
... NUMBER = locatedExpr(Word( nums ))
... STATEMENT = ZeroOrMore( NUMBER )
... print( STATEMENT.parseString( "1 2 34" ).dump() )
[[0, '1', 1], [2, '2', 3], [4, '34', 6]]
[0]:
[0, '1', 1]
- locn_end: 1
- locn_start: 0
- value: '1'
[1]:
[2, '2', 3]
- locn_end: 3
- locn_start: 2
- value: '2'
[2]:
[4, '34', 6]
- locn_end: 6
- locn_start: 4
- value: '34'