Первая проблема заключается в этой строке:
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']]