在pyparsing中正确使用nestedExpr

苛刻

我有一个键值对的嵌套表示,例如:
情况1:

str = " value 23"

情况2:

str = " value { \
          {'name' {value 'joint'}}, 
          {'id' {value 51}} \
         }"

或情况3:

str = " value { \
           { 'drive' { value 'joint1'}}, \
           { 'steer' { value 45.35}}
         }"

可以看出,嵌套可以达到无限的水平。例如在上面的示例中,'joint2'也可以使用花括号。value是这里唯一的关键字。最后,值可以是整数,浮点数或单引号字符串。

我在这里有一个非常简单的代码:

field_name = Keyword("value").supress()
real = Combine(Word(nums) + '.' + Word(nums))
values = real | Word(
    nums) | sglQuotedString.setParseAction(removeQuotes)

nested = nestedExpr('{', '}')
grammar = field_name + \
    (values | (nestedExpr('{', '}') + Optional(',').suppress()))("values")

对于案例2,我得到了输出

{'values': [[["'name'", ['value', "'joint'"]], ',', ["'id'", ['value', '51']]]]}

首先,','value也将被解析。其次,我不确定我nestedExpr是否使用正确。我应该Dict在里面使用nestedExpr吗?

编辑1:我已经发布了上述案例的解决方案,但我意识到案例2和案例3是相同的。我真正想展示的是

情况4:

str = "value { \
         {'name' {value 'joint1' { \
                           value 12} \
                                 } \
                 } \
         }, \
         {'id' {value 51}} \
       }"

在这种情况下,我需要知道嵌套的深度吗?

苛刻

我有一个解决方案:

from pyparsing import *

_value = Keyword("value").suppress()
real = Combine(Word(nums) + '.' + Word(nums))
values = real | Word(
    nums) | sglQuotedString.setParseAction(removeQuotes)


LCB, RCB = map(Suppress, "{}")
param_val = _value + values
param_vals = Dict(OneOrMore(Group(sglQuotedString.setParseAction(
    removeQuotes) + nestedExpr('{', '}', content=param_val))))
param_values = _value + \
    nestedExpr('{', '}', content=delimitedList(
        LCB + param_vals + RCB, delim=','))

str = "value {{'name' {value 'arm_right_1_joint'}}, {'id' {value 51}}}"
res = param_values.parseString(str)

print(res.dump())

我得到结果:

[[['name', ['arm_right_1_joint']], ['id', ['51']]]]
[0]:
  [['name', ['arm_right_1_joint']], ['id', ['51']]]
  - id: ['51']
  - name: ['arm_right_1_joint']

请随时提出其他解决方案。

编辑:我找到了一个更好的解决方案。现在,它可以解析任何级别的递归。

real = Combine(Word(nums) + '.' + Word(nums))

listStr = Forward()
mapStr = Forward()
param_value = Forward()

string_value = Dict(Group(sglQuotedString.setParseAction(
    removeQuotes) + ZeroOrMore(LCB + param_value + RCB)))
string_value.setParseAction(parseActionStr)
values = Combine(Optional("-") + real) | Combine(Optional("-") + Word(
    nums)) | string_value | Keyword("false") | Keyword("true") | listStr | mapStr
listStr << delimitedList(Group(LCB + delimitedList(values) + RCB))

mapStr << (LSB + delimitedList(Group(LCB + delimitedList((Group(sglQuotedString.setParseAction(removeQuotes) +
                                                                Suppress(":") + values))) + RCB)) + RSB)
mapStr.setParseAction(parseActionDict)

param_value << _value + (values | listStr)

结果为:

str_param4 = "value { \
                  {'type' {value 'laser'}}, \
                  {'params' {value { \
                      {'upper_replacement_value' {value 10.0}}, \
                      {'use_message_range_limits' {value false}}, \
                      {'upper_threshold' {value 10.0}}}, \
                  {'name' {value 'range'}}}}}"

是:

[['laser']]
[['range']]
[[[['type', 'laser']], [['params', [[['upper_replacement_value', '10.0']], [['use_message_range_limits', 'false']], [['upper_threshold', '10.0']]], [['name', 'range']]]]]]
[0]:
  [[['type', 'laser']], [['params', [[['upper_replacement_value', '10.0']], [['use_message_range_limits', 'false']], [['upper_threshold', '10.0']]], [['name', 'range']]]]]
  [0]:
    [['type', 'laser']]
    - type: 'laser'
  [1]:
    [['params', [[['upper_replacement_value', '10.0']], [['use_message_range_limits', 'false']], [['upper_threshold', '10.0']]], [['name', 'range']]]]
    - params: [[[['upper_replacement_value', '10.0']], [['use_message_range_limits', 'false']], [['upper_threshold', '10.0']]], [['name', 'range']]]
      [0]:
        [[['upper_replacement_value', '10.0']], [['use_message_range_limits', 'false']], [['upper_threshold', '10.0']]]
        [0]:
          [['upper_replacement_value', '10.0']]
          - upper_replacement_value: '10.0'
        [1]:
          [['use_message_range_limits', 'false']]
          - use_message_range_limits: 'false'
        [2]:
          [['upper_threshold', '10.0']]
          - upper_threshold: '10.0'
      [1]:
        [['name', 'range']]
        - name: 'range'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在jQuery中正确使用$(this)

来自分类Dev

在xUnit中正确使用Theory

来自分类Dev

在python中正确使用isinstance

来自分类Dev

在Oracle中正确使用DataReader?

来自分类Dev

在Django中正确使用PasswordResetForm

来自分类Dev

在Extbase中正确使用FAL

来自分类Dev

在Reactjs中正确使用Meteorjs?

来自分类Dev

在PHP中正确使用常量

来自分类Dev

在C中正确使用ftw()

来自分类Dev

在C中正确使用递归

来自分类Dev

在Angular中正确使用TestBed

来自分类Dev

在C中正确使用递归

来自分类Dev

在Extbase中正确使用FAL

来自分类Dev

在PHP中正确使用常量

来自分类Dev

在R中正确使用if-else函数

来自分类Dev

如何从Spring Data中正确使用PagedResourcesAssembler?

来自分类Dev

如何在C中正确使用malloc?

来自分类Dev

在Python中正确使用类常量

来自分类Dev

如何在列表中正确使用Observable?

来自分类Dev

如何在GinMapBinder中正确使用TypeLiteral?

来自分类Dev

MSAccess:在查询中正确使用Nz?

来自分类Dev

在事件声明中正确使用泛型

来自分类Dev

如何在Qt中正确使用AdjustSize()

来自分类Dev

在C ++中正确使用完美转发?

来自分类Dev

如何在MySQL中正确使用索引

来自分类Dev

在多线程程序中正确使用QSqlDatabase

来自分类Dev

在Scala中正确使用Java库

来自分类Dev

如何在SUMPRODUCT函数中正确使用OR

来自分类Dev

如何在EAR中正确使用OmniFaces