Je suis en train d'analyser des phrases comme "CS 2110 ou INFO 3300". Je voudrais sortir un format comme:PyParsing: tous les jetons ne sont pas passés à setParseAction()
[[("CS" 2110)], [("INFO", 3300)]]
Pour ce faire, je pensais que je pouvais utiliser setParseAction()
. Cependant, les déclarations contenues dans print
statementParse()
suggèrent que seuls les derniers jetons sont passés en réalité:
>>> statement.parseString("CS 2110 or INFO 3300")
Match [{Suppress:("or") Re:('[A-Z]{2,}') Re:('[0-9]{4}')}] at loc 7(1,8)
string CS 2110 or INFO 3300
loc: 7
tokens: ['INFO', 3300]
Matched [{Suppress:("or") Re:('[A-Z]{2,}') Re:('[0-9]{4}')}] -> ['INFO', 3300]
(['CS', 2110, 'INFO', 3300], {'Course': [(2110, 1), (3300, 3)], 'DeptCode': [('CS', 0), ('INFO', 2)]})
Je m'y attendais tous les jetons à passer, mais il est seulement ['INFO', 3300]
. Est-ce que je fais quelque chose de mal? Ou y a-t-il un autre moyen de produire la sortie désirée?
Voici le code pyparsing: (! Vous établissiez seulement sur la Optional
)
from pyparsing import *
def statementParse(str, location, tokens):
print "string %s" % str
print "loc: %s " % location
print "tokens: %s" % tokens
DEPT_CODE = Regex(r'[A-Z]{2,}').setResultsName("DeptCode")
COURSE_NUMBER = Regex(r'[0-9]{4}').setResultsName("CourseNumber")
OR_CONJ = Suppress("or")
COURSE_NUMBER.setParseAction(lambda s, l, toks : int(toks[0]))
course = DEPT_CODE + COURSE_NUMBER.setResultsName("Course")
statement = course + Optional(OR_CONJ + course).setParseAction(statementParse).setDebug()
Oui «Charger de front» est un très bon moyen de décrire ce que je fais. Merci pour le pointeur vers l'exemple sur le wiki. –