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

Python 如何解析没有分隔符的元组?,python,python-3.x,parsing,pyparsing,Python,Python 3.x,Parsing,Pyparsing,我正在使用pyparser,希望解析包含树结构的文件,这些树结构的值存储在等号之后,没有实际的分隔符 除了数据存储在多行中的罕见情况外,我所有的解析都做得很好,所以我必须重写解析器,不要停止从等号到行尾获取值,而是从等号到另一个等号(或end),忽略前面的单词(或忽略end) 数据示例: ( ItemName = foo SomeOtherStuff = bar foo1 foo2 AString1 = ItemName SomeOtherStuff ) 代码: 这显

我正在使用pyparser,希望解析包含树结构的文件,这些树结构的值存储在等号之后,没有实际的分隔符

除了数据存储在多行中的罕见情况外,我所有的解析都做得很好,所以我必须重写解析器,不要停止从等号到行尾获取值,而是从等号到另一个等号(或
end
),忽略前面的单词(或忽略
end

数据示例:

(
  ItemName = foo
  SomeOtherStuff = bar
  foo1
  foo2
  AString1 = ItemName
  SomeOtherStuff 
)
代码:

这显然不起作用

astring=组(stringTemplate+等于+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))

但它不起作用。我得到的要么是错误,要么是解析器将所有数据作为一条记录吞并。

您使用的
~ followerby
是正确的,但是这些表达式必须是一个或多个
重复表达式的一部分。比如:

multilineString = Group(token + equals + OneOrMore(stringTemplate + ~FollowedBy(equals)))
for match in multilineString.searchString(test):
    match.pprint()
其他一些评论:

  • 查看
    token
    decimal
    stringTemplate
    的定义。现在,您将永远无法匹配
    decimal
    表达式。为了避免将
    整数
    误认为
    标记
    ,我建议您将
    标记
    改为
    单词(alphas,alphanums+“-,./:*+=#[];”
  • 您可能需要重新考虑是否允许将“=”作为
    令牌的一部分。如果有人省略了
    标记
    和定界“=”之间的空格,则原本是定界符的内容将被吸入
    标记
    键中
  • 考虑添加结果名称以帮助您访问每个键值对的键和值位:
    multilineString=Group(令牌(“键”)+equals+OneOrMore(stringTemplate+~followerdby(equals))(“值”)
    。然后您可以像
    match.key
    match.value
    那样访问它们-当然,您可以使用列表索引以
    match[0]
    的形式获取密钥,但我发现命名访问更容易使用

谢谢。这个任务和你的评论对理解pyparsing有很大帮助。这确实是一个很棒的工具。
multilineString = Group(token + equals + OneOrMore(stringTemplate + ~FollowedBy(equals)))
for match in multilineString.searchString(test):
    match.pprint()