Python中是否有解析此类序列化对象的库?
Is there a library for parsing such serialized objects in Python?
对于我的 python 程序,我有一个表示序列化对象的输入,它可以包含原始类型、数组和结构。
示例输入可能如下所示:
Struct(1.5, false, Struct2(“text”), [1, 2, 3])
示例输出为:
{
type: "Struct",
args: [
1.5,
False,
{
type: "Struct2",
args: [ "text" ]
},
[ 1, 2, 3 ]
]
}
所以,输入字符串可以有:
- 原始类型(整数、浮点数、布尔值和字符串文字)
- 数组
- 结构(结构名称和参数列表)
输入格式非常合乎逻辑,但我找不到任何现成的 libraries/code 片段来解析这种格式。
这不是一个非常干净的实现,我不能 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))
对于我的 python 程序,我有一个表示序列化对象的输入,它可以包含原始类型、数组和结构。
示例输入可能如下所示:
Struct(1.5, false, Struct2(“text”), [1, 2, 3])
示例输出为:
{
type: "Struct",
args: [
1.5,
False,
{
type: "Struct2",
args: [ "text" ]
},
[ 1, 2, 3 ]
]
}
所以,输入字符串可以有:
- 原始类型(整数、浮点数、布尔值和字符串文字)
- 数组
- 结构(结构名称和参数列表)
输入格式非常合乎逻辑,但我找不到任何现成的 libraries/code 片段来解析这种格式。
这不是一个非常干净的实现,我不能 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))