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: 結果のリスト内のタプルは単なる例です。それはdictまたは別のリストなどである可能性がありますが、それほど重要ではありません。

しかし、これまでに試したことは何でも、次のような結果が得られます。 [('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)

2 つ目の問題は、キーと値のペアを 1 つだけ解析することです。

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 に答える