правильное использование nestedExpr в pyparsing - PullRequest
1 голос
/ 04 марта 2020

У меня есть вложенное представление пар значений ключа что-то вроде:
Случай 1:

str = " value 23"

Случай 2:

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

Или случай 3:

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

Как видно, вложение может go на неограниченные уровни. например, в приведенном выше примере, '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?

Edit 1: Я уже опубликовал решение для вышеупомянутых случаев, но я понял, что случаи 2 и 3 идентичны. На самом деле я хотел показать

Случай 4:

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

Для таких случаев мне нужно знать, насколько глубока вложенность?

1 Ответ

1 голос
/ 05 марта 2020

Я получил решение:

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']

Пожалуйста, не стесняйтесь предлагать другие решения.

...