Python / Pyparding: Сложность с setresultsname
Вопрос
Я думаю, что я ошибаюсь в том, как я звоню setResultsName()
:
from pyparsing import *
DEPT_CODE = Regex(r'[A-Z]{2,}').setResultsName("Dept Code")
COURSE_NUMBER = Regex(r'[0-9]{4}').setResultsName("Course Number")
COURSE_NUMBER.setParseAction(lambda s, l, toks : int(toks[0]))
course = DEPT_CODE + COURSE_NUMBER
course.setResultsName("course")
statement = course
От холостого хода:
>>> myparser import *
>>> statement.parseString("CS 2110")
(['CS', 2110], {'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]})
Выход я надеюсь на:
>>> myparser import *
>>> statement.parseString("CS 2110")
(['CS', 2110], {'Course': ['CS', 2110], 'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]})
Делает setResultsName()
Только работа на клеммы?
Решение
Если вы измените определение course
к
course = (DEPT_CODE + COURSE_NUMBER).setResultsName("Course")
Вы получаете следующее поведение:
x=statement.parseString("CS 2110")
print(repr(x))
# (['CS', 2110], {'Course': [((['CS', 2110], {'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]}), 0)], 'Dept Code': [('CS', 0)], 'Course Number': [(2110, 1)]})
print(x['Dept Code'])
# CS
print(x['Course Number'])
# 2110
print(x['Course'])
# ['CS', 2110]
Это не совсем repr
Вы хотели, но это хватает?
Примечание, от документов:
setresultsname] возвращает скопировать оригинального объекта абсорбрия; Это так, чтобы клиент мог определить базовый элемент, такой как целое число, и ссылаться на него в нескольких местах с разными именами.
Так course.setResultsName("Course")
не работает, потому что это не влияет course
. Отказ Вы бы вместо этого должны сказать course=course.setResultsName("Course")
. Отказ Это альтернативный способ сделать то, что я сделал выше.
Не связан с StackOverflow