3

pyparsingスペースで区切られた数字に一致する単純な文法があります。

from pyparsing import *
NUMBER = Word( nums )
STATEMENT = ZeroOrMore( NUMBER )
print( STATEMENT.parseString( "1 2 34" ) )

テスト1 2 34文字列を指定すると、解析されたトークンである3つの文字列が返されます。しかし、元の文字列で各トークンの場所を見つけるにはどうすればよいですか?「一種の」構文の強調表示に必要です。

4

1 に答える 1

5

この解析アクションを 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'
于 2013-03-08T17:28:32.403 に答える