5

我正在尝试用 pyparsing 解析一行。该行由许多(键,值)组成。我想得到的是(键,值)的列表。一个简单的例子:

ids = 12 fields = name

应该导致类似: [('ids', '12'), ('fields', 'name')]

一个更复杂的例子:

ids = 12, 13, 14 fields = name, title

应该导致类似: [('ids', '12, 13, 14'), ('fields', 'name, title')]

PS:结果列表中的元组只是一个例子。它可能是一个字典或另一个列表或其他任何东西,这并不重要。

但是到目前为止,无论我尝试过什么,我都会得到如下结果: [('ids', '12 fields')]

考虑到它也是价值的一部分,Pyparsing 正在吃下一个密钥。

这是一个示例代码:

import pyparsing as P

key = P.oneOf("ids fields")
equal = P.Literal('=')
key_equal = key + equal
val = ~key_equal + P.Word(P.alphanums+', ')

gr = P.Group(key_equal+val)
print gr.parseString("ids = 12 fields = name")

有人能帮我吗 ?谢谢。

4

1 回答 1

7

第一个问题在于这一行:

val = ~key_equal + P.Word(P.alphanums+', ')

它表明该部分匹配任何字母数字序列,后跟文字', ',但它匹配任何字母数字字符序列','' '.

你想要的是:

val = ~key_equal + P.delimitedList(P.Word(P.alphanums), ", ", combine=True)

第二个问题是你只解析一个键值对:

gr = P.Group(key_equal+val)

相反,您应该尽可能多地解析:

gr = P.Group(P.OneOrMore(key_equal+val))

所以正确的解决方案是:

>>> import pyparsing as P
>>> key = P.oneOf("ids fields")
>>> equal = P.Literal('=')
>>> key_equal = key + equal
>>> val = ~key_equal + P.delimitedList(P.Word(P.alphanums), ", ", combine=True)
>>> gr = P.OneOrMore(P.Group(key_equal+val))
>>> print gr.parseString("ids = 12, 13, 14 fields = name, title")
[['ids', '=', '12, 13, 14'], ['fields', '=', 'name, title']]
于 2011-08-12T09:43:19.580 回答