为了账号安全,请及时绑定邮箱和手机立即绑定

是否有用于在 Python 中解析此类序列化对象的库?

是否有用于在 Python 中解析此类序列化对象的库?

守着星空守着你 2023-02-07 14:25:52
对于我的 python 程序,我有一个表示序列化对象的输入,它可以包含原始类型、数组和结构。示例输入可能如下所示:Struct(1.5, false, Struct2(“text”), [1, 2, 3])样本输出将是:{    type: "Struct",    args: [        1.5,        False,        {            type: "Struct2",            args: [ "text" ]        },        [ 1, 2, 3 ]    ]}所以,输入字符串可以有:原始类型(整数、浮点数、布尔值和字符串文字)数组结构(结构名称和参数列表)输入格式非常合乎逻辑,但我找不到任何现成的库/代码片段来解析这种格式。
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

这不是一个非常干净的实现,我不能 100% 确定它是否完全符合您的要求,但我建议使用Lark库来执行此操作。


与其使用现成的解析器来完成这项工作,不如自己做一个小解析器,为了节省时间,Lark 具有“保存”和“加载”功能,因此您可以保存序列化版本的解析器并加载每个解析器时间而不是在每个运行时重新创建整个解析器。希望这可以帮助 :)


from lark import Lark, Transformer


grammar = """

%import common.WS

%import common.ESCAPED_STRING

%import common.SIGNED_NUMBER


%ignore WS


start : struct


struct  : NAME "(" [element ("," element)*] ")"

element : struct | array | primitive


array : "[" [element ("," element)*] "]"

primitive : number

          | string

          | boolean


string : ESCAPED_STRING

number : SIGNED_NUMBER


boolean : TRUE | FALSE


NAME : /[a-zA-Z][a-zA-Z0-9]*/


TRUE : "true"

FALSE : "false"

"""


class T(Transformer):

    def start(self, s):

        return s[0]


    def string(self, s):

        return s[0][1:-1].replace('\\"', '"')


    def primitive(self, s):

        return s[0]


    def struct(self, s):

        return { "type": s[0].value, "args": s[1:] }


    def boolean(self, s):

        return s[0].value == "true"


    def element(self, s):

        return s[0]

    

    array = list


    def number(self, s):

        try:

            return int(s[0].value)

        except:

            return float(s[0].value)


parser = Lark(grammar, parser = "lalr", transformer = T())


test = """

Struct(1.5, false, Struct2("text"), [1, 2, 3])

"""


print(parser.parse(test))



查看完整回答
反对 回复 2023-02-07
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信