如何解析没有分隔符的元组?

2024-06-26 02:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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))

但没用。我得到的不是错误,就是解析器将所有数据作为一条记录吞噬。你知道吗


Tags: 数据token解析器groupend树结构decimalstringtemplate
1条回答
网友
1楼 · 发布于 2024-06-26 02:24:30

使用~FollowedBy是正确的,但是这些表达式必须是OneOrMore重复表达式的一部分。比如:

multilineString = Group(token + equals + OneOrMore(stringTemplate + ~FollowedBy(equals)))
for match in multilineString.searchString(test):
    match.pprint()

其他一些评论:

  • 看看tokendecimalstringTemplate的定义。现在的情况是,您永远不会匹配decimal表达式。为了避免将integer误认为token,我建议您将token改为Word(alphas, alphanums + "-,./_:*+=#[];")
  • 您可能需要重新考虑是否允许“=”作为token的一部分。如果有人省略了token和定界符“=”之间的空格,那么原本应该是定界符的内容将被吸进token键中。你知道吗
  • 考虑添加结果名称以帮助您访问每个键值对的键值位:multilineString = Group(token("key") + equals + OneOrMore(stringTemplate + ~FollowedBy(equals))("value"))。然后您可以像match.keymatch.value那样访问它们—当然,您可以使用列表索引将键获取为match[0],但是我发现命名的访问更容易使用。你知道吗

相关问题 更多 >