【问题标题】:Adding external information to ParseResults before return返回前向 ParseResults 添加外部信息
【发布时间】:2012-07-27 22:14:24
【问题描述】:

我想在返回之前向 ParseResults 添加外部信息。我将解析结果返回为 asXML()。将外部数据表示为字典,以便最终解析为XML。

这是添加外部数据之前的代码 从 pyparsing 导入 *

# a hypothetical outer parser, with an unparsed SkipTo element
color = oneOf("red orange yellow green blue purple")
expression = SkipTo("XXX") + Literal("XXX").setResultsName('ex') + color.setResultsName('color')

data = "JUNK 100 200 10 XXX green"
print expression.parseString(data).dump()

# main grammar
def minorgrammar(toks):
    # a simple inner grammar
    integer = Word(nums)
    grammar2 = integer("A").setResultsName('A') + integer("B").setResultsName('B') + integer("C").setResultsName('C')

    # use scanString to find the inner grammar
    # (since we just want the first occurrence, we can use next
    # instead of a for loop with a break)
    t,s,e = next(grammar2.scanString(toks[0],maxMatches=1))



    # remove 0'th element from toks
    del toks[0]

    # return a new ParseResults, the sum of t and everything 
    # in toks after toks[0] was removed
    return t + toks

grammar1 = expression.setParseAction(minorgrammar)
x = grammar1.parseString(data).asXML("main")
print x 

输出是

<main>
  <A>100</A>
  <B>200</B>
  <C>10</C>
  <ex>XXX</ex>
  <color>green</color>
</main>

添加外部数据后的代码

    ...
    external_data = {'name':'omar', 'age':'40'}

    return t + toks + ParseResults(external_data)

grammar1 = expression.setParseAction(minorgrammar)

x = grammar1.parseString(data).asXML("main")

print x

输出

<main>
  <A>100</A>
  <B>200</B>
  <C>10</C>
  <ex>XXX</ex>
  <color>green</color>
  <ITEM>{&apos;age&apos;: &apos;40&apos;, &apos;name&apos;: &apos;omar&apos;}</ITEM>
</main>

我想要表单中的输出

<main>
  <A>100</A>
  <B>200</B>
  <C>10</C>
  <ex>XXX</ex>
  <color>green</color>
  <name>omar</name>
  <age>40</age>
</main>

该代码中的错误是什么?比

【问题讨论】:

    标签: python pyparsing


    【解决方案1】:

    一个问题是这个片段:

    external_data = {'name':'omar', 'age':'40'}
    return t + toks + ParseResults(external_data)
    

    ParseResults 将 dict 作为构造函数参数,但我认为它不会做你想做的事情 - 它只是将 dict 分配为第 0 个元素,并且不分配任何结果名称。

    可以使用 ParseResults 的 dict 样式赋值将命名值赋值:

    pr = ParseResults(['omar','40'])
    for k,v in external_data.items():
        pr[k] = v
    

    看看这是否能让你更接近你想要的格式。

    编辑:嗯,似乎 asXML 对如何将命名结果添加到 ParseResults 更挑剔,而不仅仅是设置名称。这会更好:

    def addNamedResult(pr, value, name):
        addpr = ParseResults([value])
        addpr[name] = value
        pr += addpr
    

    然后在您的解析操作中,使用它们的名称添加值:

    addNamedResult(toks, 'omar', 'name')
    addNamedResult(toks, '40', 'age')
    

    【讨论】:

    • 输出
      100 200 10XXXgreen omar40
    • 有没有什么技术可以在返回结果之前注入外部数据?谢谢
    • 非常感谢。我已经修改了你的函数来接受字典
    • 请 Paul,如果你有时间,请给我们更多关于 ParseResultss() 类、它的结构和示例的解释
    【解决方案2】:

    非常感谢保罗。我修改了您的函数以添加数据字典

    ...
    external_data = {'name':'omar', 'age':'40'}
    return t + toks +  addDicResult(external_data)
    ...
    
    def addDicResult(dict):
         pr = ParseResults([])
         for k, v in dict.items():
             addpr = ParseResults([v])
             addpr[k] = v
             pr += addpr
         return pr
    
    The output
    <main>
      <A>100</A>
      <B>200</B>
      <C>10</C>
      <ex>XXX</ex>
      <color>green</color>
      <age>40</age>
      <name>omar</name>
    </main>
    

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 2022-11-27
      • 2019-11-14
      • 1970-01-01
      • 2021-04-29
      • 2010-09-08
      相关资源
      最近更新 更多