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" }
}
}
设计输出如下:
^{pr2}$我尝试使用以下代码失败:
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'。在
有几件事:
在
tag
的定义中,您将其包装为Group
,但我认为您确实希望使用Combine
。在第二件事,你在
exp
中的嵌套混合了重复和递归。在这对我很有用(同样,以
dot
上的.suppress()
为例):给予:
^{pr2}$这可能不是您想要的答案,但我认为Flex将在这类任务中对您有很大帮助。甚至可能有一个python包装器
我在你的代码中做了一些改动以使它能正常工作,我用注释来指明出了什么问题。在
相关问题 更多 >
编程相关推荐