2016-02-15 1 views
2

J'essaye d'analyser certaines fonctions arguments avec PyParsing mais j'ai du mal à obtenir la bonne syntaxe. A savoir, étant donné:Capture des parenthèses littérales entre parenthèses dans pyparsing

str = "(key=val())" 

Je voudrais l'analyseur pour revenir ['key', 'val()'].

J'ai essayé de faire fonctionner ceci avec le code suivant; les appels .suppress() sont volontairement omis pour plus de clarté.

ob = Literal("(") 
cb = Literal(")") 
key = Word(alphas) 
value = Word(alpha + "()") 
parser = ob + key + "=" + value + cb 
print parser.parseString(str) 

mais bien sûr, il correspond également à la parenthèse fermante finale et donc j'obtiens une exception ParseException.

Existe-t-il une solution élégante à cela? Par exemple, j'ai regardé nestedExpr mais dans ce cas ce n'est pas strictement une imbrication puisque je veux que le val() soit traité comme un littéral. De même this question fait allusion au problème mais ne donne pas de solution.

Répondre

0

Votre définition

value = Word(alpha + "()") 

est trop libérale. Non seulement il s 'Trailing match(), mais aussi tout ceux intégrés, et quelle que soit l'ouverture et la fermeture correspondant, des valeurs telles que:

SLDFJJ(sldkjf) 
sdlkfj(sldkfj(lkskdjf)))(

et même juste:

(((((())(()()()() 

Je vous suggère de définir la syntaxe d'un identificateur, quelque chose comme:

identifier = Word(alphas+'_', alphanums+'_') 

puis composez la valeur avec:

value = Combine(identifier + '()') 

Maintenant, l'expression value n'acceptera pas de manière erronée tout () s intégré, et analysera seulement le () final et rien d'autre.

+0

Excellent - merci pour la clarification et le bon logiciel! – jkeirstead