Python pyparsing:如何获取令牌位置?

Python pyparsing:如何获取令牌位置?,python,pyparsing,Python,Pyparsing,我有一个简单的pyparsing语法,它匹配由空格分隔的数字: from pyparsing import * NUMBER = Word( nums ) STATEMENT = ZeroOrMore( NUMBER ) print( STATEMENT.parseString( "1 2 34" ) ) 给定1234测试字符串,它返回3个已解析标记的字符串。但是如何在原始字符串中找到每个标记的位置呢?我需要它来突出显示“类”语法。将此解析操作添加到数字: NUMBER.setParseAct

我有一个简单的
pyparsing
语法,它匹配由空格分隔的数字:

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

给定
1234
测试字符串,它返回3个已解析标记的字符串。但是如何在原始字符串中找到每个标记的位置呢?我需要它来突出显示“类”语法。

将此解析操作添加到数字:

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')]
编辑:

从我对这篇文章的最初回答开始,我在pyparsing中添加了
locatedExpr
helper,它将给出特定表达式的起始和结束位置。现在,这可以简单地写为:

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'

嗨,Paul,当我使用此方法获取令牌时,令牌会首先放在输出中,因此如果我有一个命名令牌(即单词(“foo”),那么当我获取“results.foo”时,我最终会得到列号。有没有一种方法可以维护命名结果,但仍然可以获得列号?我找到了:
元素。setParseAction(lambda locn,tokens:(tokens[0],locn))
-->这将标记放在第一位,位置放在最后我无法找到如何通过命名范围达到位置值;这可能吗@PaulMcG@skelliam-您介意将此作为新问题发布吗?我并不是在寻找更多的代表:),它只是给了我(和其他人)更多的空间来发布带有示例代码和描述的答案。(另外,我不喜欢在评论中出现冗长的讨论主题。)@Hi angle-我已经更新了我的答案,以反映pyparsing中的一个新功能,这使我的回答更加容易。