Python - создать JSON из строки с выражением распознавания - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь создать JSON из строки с выражением, но перед этим мне нужно заменить операнд.

Это входные данные от пользователя:

"Apple == 5 & (Plum == 7 | Pear == 8)"

Я должен заменить "=="to" eq "или" & "to" и "и т. д. (и более логическое выражение, если это необходимо)

"Apple eq 5 and (Plum eq 7 or Pear eq 8)"

И, наконец, это должен быть результат в JSON Если быть более точным это:

{
                "CategoryId": 0,

                "FilterRequest":
                {

                               "Page": 1,

                               "PageSize": 10,

                               "Filter": 
                               { 
                                   "Logic": "and",

                                   "Filters": [
                                       { 
                                           "Logic": "or",
                                           "Filters": [
                                               { 
                                                   "Field": "Plum",
                                                   "Operator": "eq", 
                                                   "Value": "7"
                                               },
                                               { 
                                                   "Field": "Pear",
                                                   "Operator": "eq", 
                                                   "Value": "8"
                                               }
                                           ]
                                       },
                                       { 
                                           "Field": "Apple",
                                           "Operator": "eq", 
                                           "Value": "5"
                                       }
                                   ]
                               }

                }
}

Не могли бы вы рассказать мне свои идеи, как это сделать?может быть, единственный способ ... спасибо

РЕДАКТИРОВАНИЕ: 14/5/2019

Я пытался найти как можно больше информации о моей проблеме, и я думаю, что 'м на полпути.Если я когда-либо выбрал правильный путь.Не могли бы вы дать мне отзыв или совет по поводу кода ниже?

string = "Apple == 5 & (Plum == 7 | Pear == 8)"

string = string.replace('==', ' eq ')
string = string.replace('<>', ' ne ')
string = string.replace('>' , ' gt ')
string = string.replace('>=', ' ge ')
string = string.replace('<' , ' lt ')
string = string.replace('<=', ' le ')
string = string.replace('&' , ' and ')
string = string.replace('|' , ' or ')
string = string.replace('!=', ' not ')

print(string)
# "Apple eq 5 and (Plum eq 7 or Pear eq 8)"


import pyparsing as pp

    operator = pp.Regex(r">=|<=|!=|>|<|=|eq").setName("operator")
    number = pp.Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?")
    identifier = pp.Word(pp.alphas, pp.alphanums + "_")
    and_ = CaselessLiteral("and").setResultsName("Logic")
    or_ = CaselessLiteral("or").setResultsName("Logic")
    not_ = CaselessLiteral("not").setResultsName("Logic")
    logic = [
            (and_, 2, (pp.opAssoc.LEFT),),
            (or_, 2, pp.opAssoc.LEFT,),
            (not_, 1, pp.opAssoc.RIGHT,),
            ]
    comparison_term = (identifier | number)
    condition = pp.Group(comparison_term("Field") + operator("Operator") + comparison_term("Value"))
    expr = pp.operatorPrecedence(condition("Filters"), logic).setResultsName("Filter")

pars = expr.parseString(string).dump()

import json

    with open("C:\\Users\\palo173\\Desktop\\example.json","w") as f:
        json.dump(o,f)

Фактический результат, но, к сожалению, не окончательный.Мне нравится слышать ваши идеи, что делать дальше.

{
    "Filter": {
        "Filter": {
            "Filters": [
                {
                    "Field": "Apple",
                    "Operator": "eq",
                    "Value": "5"
                },
                {
                    "Filters": [
                        {
                            "Field": "Plum",
                            "Operator": "eq",
                            "Value": "7"
                        },
                        {
                            "Field": "Pear",
                            "Operator": "eq",
                            "Value": "8"
                        }
                    ],
                    "Logic": "or"
                }
            ],
            "Logic": "and"
        }
    }
}

1 Ответ

0 голосов
/ 02 мая 2019

Я бы предложил использовать

string.replace(old, new, count)
# count is optional, leave it blank like below and it does all occurences

, например,

string = "Apple == 5 & (Plum == 7 | Pear == 8)"

string.replace('==', 'eq')
string.replace('&', 'and')
string.replace('|', 'or')

print(string)

>Apple eq 5 and (Plum eq 7 or Pear eq 8
# and so on

, теперь это делает только замену, может быть, использовать цикл for для итерации к списку строк, ноЯ полагаю, что вы можете сделать это.

...