我使用的是pyparser,希望解析包含树结构的文件,这些树结构的值存储在等号之后,否则没有实际的分隔符。你知道吗
我已经把所有的解析都做得很好了,除了极少数情况下数据存储在多行中,所以我必须重写解析器,不要停止从等号到行尾,而是从等号到另一个等号(或end
),忽略前面的单词(或忽略end
)。你知道吗
数据示例:
(
ItemName = foo
SomeOtherStuff = bar
foo1
foo2
AString1 = ItemName
SomeOtherStuff
)
代码:
equals = Suppress("=")
token = Word(alphanums + "-,./_:*+=#[];")
decimal = Regex(r'-?0|[1-9]\d*').setParseAction(lambda t:int(t[0]))
stringTemplate = token | decimal
sexpList = Group(Suppress("(") + ZeroOrMore(sexp) + Suppress(")"))
sexp = Forward()
这显然行不通
astring = Group(stringTemplate + equals + stringTemplate)
所以我试过这些:
multilineString = Group(token + equals + OneOrMore(stringTemplate) + ~FollowedBy(stringTemplate + equals))
multilineString = Group(token + equals + OneOrMore(stringTemplate) + NotAny(stringTemplate + equals))
multilineString = Group(token + equals + OneOrMore(stringTemplate) + ~(stringTemplate + equals))
但没用。我得到的不是错误,就是解析器将所有数据作为一条记录吞噬。你知道吗
使用
~FollowedBy
是正确的,但是这些表达式必须是OneOrMore
重复表达式的一部分。比如:其他一些评论:
token
、decimal
和stringTemplate
的定义。现在的情况是,您永远不会匹配decimal
表达式。为了避免将integer
误认为token
,我建议您将token
改为Word(alphas, alphanums + "-,./_:*+=#[];")
token
的一部分。如果有人省略了token
和定界符“=”之间的空格,那么原本应该是定界符的内容将被吸进token
键中。你知道吗multilineString = Group(token("key") + equals + OneOrMore(stringTemplate + ~FollowedBy(equals))("value"))
。然后您可以像match.key
和match.value
那样访问它们—当然,您可以使用列表索引将键获取为match[0]
,但是我发现命名的访问更容易使用。你知道吗相关问题 更多 >
编程相关推荐