gpt4 book ai didi

python - 如何在 Python 中解析 JSON-XML 混合文件

转载 作者:太空狗 更新时间:2023-10-30 01:13:23 25 4
gpt4 key购买 nike

我想用 Python 解析具有以下语法(但嵌套数量不定)的文件:

<XProtocol>
{
<str1."fds"> "str2"
<str3> 123.0
<str4> { 1 2 3 4 5 6 6 "str" "str" 43 "str" 4543 }
<weird1."str5">
{
<weird2."str6"> { "str" }
<also."weird3"> 1
<againweird> { 1 "fds" }
{ }
<even> <more."weird4"> { } { } { } { "a" }
}
}

期望的输出类似于:

'XProtocol':
{
'str1."fds"': 'str2',
'str3': 123.0,
'str4': (1, 2, 3, 4, 5, 6, 6, 'str', 'str', 43, 'str', 4543),
'weird1."str5"':
{
'weird2."str6"': ( 'str' ),
'also."weird3"': 1,
'againweird': ((1, 'fds'), None),
'even': { 'more."weird4"': (None, None, None, 'a') },
}
}

我尝试使用以下代码未成功:

import pyparsing as pp

def parse_x_prot(text):
lbra = pp.Literal('{').suppress()
rbra = pp.Literal('}').suppress()
lang = pp.Literal('<').suppress()
rang = pp.Literal('>').suppress()
dot = pp.Literal('.').suppress()
cstr = pp.quotedString.addParseAction(pp.removeQuotes)
tag = pp.Group(
lang +
pp.Word(pp.alphanums) +
pp.Optional(pp.Group(dot + cstr)) +
rang)
val = pp.OneOrMore(
cstr | pp.Word(pp.nums + '.')
)
exp = pp.Forward()
exp << pp.OneOrMore(
pp.Group(
tag + pp.OneOrMore(
(lbra + (val | exp) + rbra) |
(val + exp)
)
)
)
return exp.parseString(text)

我一定是做错了什么,但还没有弄清楚到底是什么……更准确地说:下面的代码告诉我它需要一个“}”而不是一个新的“标签”。

最佳答案

一些事情:

在您定义的 tag 中,您将其包装在一个 Group 中,但我认为您真的想使用 Combine

第二,您在 exp 中的嵌套混淆了重复和递归。

这对我有用(同样,采用 dot 上的 .suppress()):

tag = pp.Combine(
lang +
pp.Word(pp.alphas, pp.alphanums) +
pp.Optional(dot + cstr) +
rang).setName("tag")

exp = pp.Forward()
key_value = pp.Group(tag + exp)
number = pp.Regex(r'[+-]?\d+(\.\d*)?').setName("number")
exp <<= (number |
cstr |
key_value |
pp.Group(lbra + pp.ZeroOrMore(exp) + rbra))

给予:

['XProtocol', [['str1.fds', 'str2'], ['str3', '123.0'], ...
[0]:
XProtocol
[1]:
[['str1.fds', 'str2'], ['str3', '123.0'], ['str4', ['1', '2', '3',...
[0]:
['str1.fds', 'str2']
[1]:
['str3', '123.0']
[2]:
['str4', ['1', '2', '3', '4', '5', '6', '6', 'str', 'str', '43', ...
[0]:
str4
[1]:
['1', '2', '3', '4', '5', '6', '6', 'str', 'str', '43', ...
[3]:
['weird1.str5', [['weird2.str6', ['str']], ['also.weird3', ...
[0]:
weird1.str5
[1]:
[['weird2.str6', ['str']], ['also.weird3', '1'], ['againweird', ...
[0]:
['weird2.str6', ['str']]
[0]:
weird2.str6
[1]:
['str']
[1]:
['also.weird3', '1']
[2]:
['againweird', ['1', 'fds']]
[0]:
againweird
[1]:
['1', 'fds']
[3]:
[]
[4]:
['even', ['more.weird4', []]]
[0]:
even
[1]:
['more.weird4', []]
[0]:
more.weird4
[1]:
[]
[5]:
[]
[6]:
[]
[7]:
['a']

关于python - 如何在 Python 中解析 JSON-XML 混合文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35486104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com