В Python то, что что-то выглядит как список, содержащий список и дикт, не означает, что это так.Объекты Python реализуют метод __repr__
, который отображает информативную строку, но это иногда вводит в заблуждение.В случае pyparsing метод parseString возвращает объект типа ParseResults.ParseResults может вести себя как списки и как диктовки, поэтому, когда вы распечатываете один, он печатает этот кортеж:
(list of matched tokens, dict of named tokens)
Если вы используете индексацию списка (с использованием целочисленной или слайсной записи), то ParseResults __getitem__
метод будет указывать в списке совпадающих токенов.Если вы используете индексирование ключей (используя нецелочисленный ключ), метод ParseResults __getitem__
будет использовать ключ на указании именованных токенов для возврата значения, связанного с этим именем, независимо от положения.Если ключ будет действительным идентификатором Python, то вы даже можете использовать доступ к атрибуту объекта - в этом случае метод ParseResults __getattr__
будет использовать ключ и для индексации в поле ввода именованных токенов, но с разницей: вСобытие KeyError, используя синтаксис атрибута объекта, даст вам пустую строку ''.Вот более подробный пример, следуйте комментариям для описания различных вариантов:
from pyparsing import *
# define an integer token, and a parse-time conversion function
def cvtInteger(tokens):
return int(tokens[0])
integer = Word(nums).setParseAction(cvtInteger)
# define an animal type, with optional plural 's'
animal = Combine(oneOf("dog cat monkey duck llama") + Optional("s"))
# define an expression for some number of animals
# assign results names 'qty' and 'animal' for named access
# to parsed data tokens
inventoryItem = integer("qty") + animal("animal")
# some test cases
items = """\
7 llamas
1 duck
3 dogs
14 monkeys""".splitlines()
for item in items:
info = inventoryItem.parseString(item)
# print the parsed item
print type(info), repr(info)
# use string key to access dict item
print info['qty']
# use object attribute to access dict item
print info.animal
# use list indexing to access items in list
print info[-1]
# use object attribute to access
print info.average_weight
Отпечатки:
<class 'pyparsing.ParseResults'> ([7, 'llamas'], {'animal': [('llamas', 1)], 'qty': [(7, 0)]})
7
llamas
llamas
<class 'pyparsing.ParseResults'> ([1, 'duck'], {'animal': [('duck', 1)], 'qty': [(1, 0)]})
1
duck
duck
<class 'pyparsing.ParseResults'> ([3, 'dogs'], {'animal': [('dogs', 1)], 'qty': [(3, 0)]})
3
dogs
dogs
<class 'pyparsing.ParseResults'> ([14, 'monkeys'], {'animal': [('monkeys', 1)], 'qty': [(14, 0)]})
14
monkeys
monkeys
Таким образом, чтобы ответить на свой оригинальный вопрос, вы должны быть в состоянии использоватьсемантика доступа к списку, чтобы получить значение, возвращаемое вашим действием синтаксического анализа:
parseList.append(parser.parseString("monkey")[0])