【发布时间】:2009-12-15 05:05:23
【问题描述】:
Python 爱好者:
假设你想使用 Pyparsing 解析以下字符串:
'ABC_123_SPEED_X 123'
ABC_123 是一个标识符; SPEED_X 是一个参数,123 是一个值。我想到了以下使用 Pyparsing 的 BNF:
Identifier = Word( alphanums + '_' )
Parameter = Keyword('SPEED_X') or Keyword('SPEED_Y') or Keyword('SPEED_Z')
Value = # assume I already have an expression valid for any value
Entry = Identifier + Literal('_') + Parameter + Value
tokens = Entry.parseString('ABC_123_SPEED_X 123')
#Error: pyparsing.ParseException: Expected "_" (at char 16), (line:1, col:17)
如果我从中间删除下划线(并相应地调整 Entry 定义)它会正确解析。
我怎样才能让这个解析器更懒一点,等到它与关键字匹配(而不是将整个字符串作为标识符并等待不存在的_。
谢谢。
[注意:这是对我的问题的完全重写;我还没有意识到真正的问题是什么]
【问题讨论】:
-
我知道很多:在分配
Parameter时,您应该使用|,而不是or。 -
这个问题的标题应该是“Non-greedy matching in pyparsing”。
-
@gotgenes:完成。做了一个更清晰的标题。
-
@Robert Rossney:事实上,我应该使用
^,因为我想要尽可能长的匹配。谢谢! -
@Arrieta:
^在这里是不必要的,因为所有 3 个选项的长度都相同。
标签: python parsing grammar pyparsing