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

2024-10-05 14:28:16 发布

您现在位置:Python中文网/ 问答频道 /正文

给予

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']

嗯,我希望在DICT里能看到五个项目。我对Dict、ZeroOrMore和Group的使用似乎与网上的其他例子一致。似乎只有第一项匹配。我做错什么了?你知道吗

蒂亚

代码战士


Tags: stringitemsitemdumpppwordlinesprint
1条回答
网友
1楼 · 发布于 2024-10-05 14:28:16

这比你想象的要容易。(对我们中的一些人来说,这只需要几个星期的练习。)

  • 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

相关问题 更多 >