从包含一个或多个标记的字符串构建字典

时间:2018-03-08 19:42:45

标签: python pyparsing

给定的

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,

代码战士

1 个答案:

答案 0 :(得分:1)

这比你想象的要容易。 (我们中的一些人只需要数周的练习。)

  • v_number表示数值,而v_string表示不带引号的字符串值非常简单。
  • 我已将Combine与带引号的字符串一起使用,以便在解析结果中字符串中包含引号。
  • 我已将Groupkeyvalue一起使用,以便这些值在解析器的输出中配对。
  • 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