Python 如何解析没有分隔符的元组?
我正在使用pyparser,希望解析包含树结构的文件,这些树结构的值存储在等号之后,没有实际的分隔符 除了数据存储在多行中的罕见情况外,我所有的解析都做得很好,所以我必须重写解析器,不要停止从等号到行尾获取值,而是从等号到另一个等号(或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 ) 代码: 这显
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()