【问题标题】:Type checking on results with pyparsing使用 pyparsing 对结果进行类型检查
【发布时间】:2012-10-16 13:16:19
【问题描述】:

我是使用 pyparsing 的新手,但我找不到如何解决这个非常简单的问题。我(目前)有一个简单的语法,但我找不到根据我在语法中定义的类型来区分解析结果的方法。

也许用一个例子来解释它会更容易。假设这个元素:

elem = foo | bar

当我调用时:

elem.parseString("...")

假设字符串与我的语法匹配,我如何区分它是否与“foo”或“bar”匹配?我得到了一个 ParseResults 的实例对象,没有这样的元数据。

提前致谢。

【问题讨论】:

    标签: python parsing pyparsing


    【解决方案1】:

    Jon Clements 的回答是正确的,这里只是一些额外的代码来支持他的帖子,展示了如何使用 getName() 来检测你得到了哪个词:

    >>> from pyparsing import Literal, OneOrMore, Group
    >>> bar = Literal('bar').setResultsName('BAR')
    >>> foo = Literal('foo')('FOO') # using short form
    >>> grammar = OneOrMore(Group(foo | bar))
    >>> parsed = grammar.parseString('bar foo')
    >>> for p in parsed: print p[0], p.getName()
    ... 
    bar BAR
    foo FOO
    

    【讨论】:

    • 谢谢 Paul - 我希望你能参与进来。我不知道 .getName 所以我也学到了一些东西 +1(请注意 - 作为图书馆的作者你有一点优势;))
    • 是的,我不想插话并从你那里偷看你的复选标记 - 我需要我能得到的所有 pyparsing 贡献者(我通常会奖励他们 +1 顺便说一句)。
    【解决方案2】:

    您可以为它们指定一个名称(使用 Literal 的复杂示例):

    foo = Literal('foo').setResultsName('foo')
    bar = Literal('bar').setResultsName('bar')
    grammar = foo | bar
    parsed = grammar.parseString('bar foo')
    print parsed
    # (['bar'], {'bar': [('bar', 0)]})
    print parsed.asDict()
    # {'bar': 'bar'}
    

    【讨论】:

    • 谢谢!我不明白他们为什么不通过反射来命名,但至少 setResultsName() 有效。
    • 嗯,执行 asDict() 的问题是我丢失了订单,这在这种情况下很重要...
    • @Wikier - 不幸的是,您不能在 Python 的作业中使用反射。最接近的方法是使用缩写形式 expr(name) 等效于 expr.setResultsName(name),或者在您的情况下:foo = Literal('foo')('foo') 然后当您遍历结果时,在返回的 ParseResults 对象上使用 getName()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2020-07-13
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多