2013-05-09 75 views
3

我试图用pyparsing解析如下形式解析使用pyparsing

x = "/user/test" 
y = 3 

这里的一个配置文件配置文件是我的代码片段

ParserElement.defaultWhitespaceChars = (" \t") 
END = StringEnd() 
NL = LineEnd().suppress() 
assignment = Literal('=') 

key_str = CharsNotIn("=") 
value_str = Group(~assignment + restOfLine) 

line = Group(key_str + assignment + value_str) 
lines = ZeroOrMore(line) 
lines.ignore(NL) 

text = """ 
y = 3 
x = 2 
""" 

,我从parseFile得到的输出告诉我它仅解析第一行。任何人都可以帮我找出我做错了什么吗?

+0

你是不愿意使用已经可以解析,看起来有点像这个文件的库?例如https://pypi.python.org/pypi/configobj/ – SingleNegationElimination 2013-05-09 17:43:53

+0

感谢您的输入。我正在执行额外的解析工作(例如解析调度程序日志,某些脚本文件等)。在这种情况下,我试图更好地理解过去几周的pyparsing。我认为自己是pyparsing领域的新手,所以想要得到一些关于我在这里做错了什么的指示。 – 2013-05-09 17:51:01

+0

@AbhijitBhattacharya - 用'pyparsing'标签搜索其他问题/答案。您还可以访问http://pyparsing.wikispace.com上的wiki,并阅读wiki主页上的讨论选项卡。 – PaulMcG 2013-05-10 13:41:38

回答

2

它看起来像你在正确的轨道上。也许你在练习text时遇到了错误。将下面的行代码中的

print lines.parseString(text) 

给人的预期输出

[['y ', '=', [' 3']], ['x ', '=', [' 2']]] 

顺便说一句,通常你希望在解析时保持空白。令牌通常是唯一重要的东西。这是我会怎么解析你的例子:

EOL = LineEnd().suppress() 
EQ = Literal("=").suppress() 
val = Word(alphanums) 
line = Group(val('key') + EQ + val('val') + EOL) 
grammar = OneOrMore(line) 

for x in grammar.parseString(text): 
    print x.dump() 

在这种情况下,输出是好得多

['y', '3'] 
- key: y 
- val: 3 
['x', '2'] 
- key: x 
- val: 2 
+0

谢谢。你是对的。我已经得到了它。 – 2013-05-09 18:18:19

+0

没问题,欢迎来到Stack Overflow!通常该协议是upvote有用的答案和“接受”解决您的问题的答案。 – Hooked 2013-05-09 18:20:32

+0

我已经更新了答案,以在语法中显示不同的方法。 – Hooked 2013-05-09 18:23:11