给定的
import pyparsing as pp
lines = '''\
(xcoord -23899.747)
(ycoord 14349.544)
(elev 23899)
(region "mountainous")
(rate multiple)'''
leftParen = pp.Literal('(')
rightParen = pp.Literal(')')
doublequote = pp.Literal('"')
v_string = pp.Word(pp.alphanums)
v_quoted_string = pp.Combine( doublequote + v_string + doublequote)
v_number = pp.Word(pp.nums+'.'+'-')
keyy = v_string
valu = v_string | v_quoted_string | v_number
item = pp.Group( pp.Literal('(').suppress() + keyy + valu + pp.Literal(')').suppress()
items = pp.ZeroOrMore( item)
dicct = pp.Dict( items)
pp.ParserElement.setDefaultWhitespaceChars('\r\n\t ')
print "item yields: " , item.parseString( lines).dump()
print "items yields: " , items.parseString( lines).dump()
print "dicct yields: ", dicct.parseString( lines).dump()
给出
item yields: [['xcoord', '-23899.747']]
[0]:['xcoord', '-23899.747']
items yields: [['xcoord', '-23899.747']]
[0]:['xcoord', '-23899.747']
dicct yields: [['xcoord', '-23899.747']]
[0]:['xcoord', '-23899.747']
嗯。我希望在dicct中看到五个项目。我对Dict,ZeroOrMore和Group的使用似乎与网上的其他例子一致。似乎只有第一个项目匹配。我做错了什么?
TIA,
代码战士
答案 0 :(得分:1)
这比你想象的要容易。 (我们中的一些人只需要数周的练习。)
v_number
表示数值,而v_string
表示不带引号的字符串值非常简单。Combine
与带引号的字符串一起使用,以便在解析结果中字符串中包含引号。Group
与key
和value
一起使用,以便这些值在解析器的输出中配对。ZeroOrMore
允许任意数量的键值对,包括零。lines = '''\
(xcoord -23899.747)
(ycoord 14349.544)
(elev 23899)
(region "mountainous")
(rate multiple)'''
import pyparsing as pp
key = pp.Word(pp.alphas)
v_number = pp.Word(pp.nums+'.'+'-')
v_string = pp.Word(pp.alphas)
v_quoted_string = pp.Combine(pp.Literal('"') + v_string + pp.Literal('"') )
value = v_number | v_string | v_quoted_string
item = pp.Literal('(').suppress() + pp.Group(key + value) + pp.Literal(')').suppress()
collection = pp.ZeroOrMore(item)
result = {}
for item in collection.parseString(lines):
result[item[0]] = item[1]
for key in result:
print (key, result[key])
输出:
xcoord -23899.747
ycoord 14349.544
elev 23899
region "mountainous"
rate multiple