2017-06-14 5 views
1

J'utilise actuellement pyparsing pour identifier si une parenthèse imbriquée est utilisée dans une chaîne, afin d'identifier des numéros de référence concaténés par erreur à des mots.Expression imbriquée de Pypars: Retour des caractères de nid dans ParseResults

Par exemple, 'apple (4)'.

Je souhaite être en mesure d'identifier le sous-poste de référence ('(4)'). Toutefois, lorsque j'utilise searchString, il renvoie un objet ParseResults de [[7]], qui ne fournit pas la parenthèse. Je veux trouver la sous-chaîne dans le jeton d'origine, je dois donc inclure les caractères d'imbrication dans l'objet ParseResults. Par exemple, je veux rechercher '(4)'. Existe-t-il un moyen de faire en sorte que searchString renvoie les caractères d'imbrication.

+0

Pouvez-vous être plus précis sur ce que ces expressions parenthétiques pourraient ressembler , que vous devez prendre en charge l'imbrication? 'nestedExpr' est une aide rapide et corrompue pour sauter rapidement par-dessus les parens, les accolades, les parenthèses imbriquées, etc., préservant ainsi la structure de l'imbrication. Si vous voulez juste la sous-chaîne brute, retournez 'nestedExpr' dans' originalTextFor', qui devrait inclure les '()' '. Mais si vous voulez vraiment donner un sens au contenu, alors je vous suggère de définir des expressions récursives réelles pour eux. – PaulMcG

Répondre

1

Question: Y at-il un moyen de faire revenir les personnages searchString de nid.

Considérons les exemples suivants:

data = 'apple(4), banana(13), juice(1)' 

from pyparsing import Word, nums, alphas 

nested = Word(alphas) + '(' + Word(nums) + ')' 
for item in data.split((',')): 
    print(item, "->", nested.searchString(item)) 

sortie:

apple(4), ->[['apple', '(', '4', ')']] 
banana(13), ->[['banana', '(', '13', ')']] 
juice(1), ->[['juice', '(', '1', ')']] 

import re 

nObj = re.compile('(\w+?)(\(\d+\))') 
findall = nObj.findall(data) 
print('findall:{}'.format(findall)) 

Sortie:

findall:[('apple', '(4)'), ('banana', '(13)'), ('juice', '(1)')] 

Testé avec Python: 3.4.2

+0

Cette réponse ne prend pas en charge l'imbrication, mais l'exemple de l'OP ne permet pas de savoir si l'imbrication est réellement requise. Ce que vous avez ici devrait fonctionner correctement avec le texte d'exemple original. Deux autres choses que vous pourriez essayer - ajouter une action d'analyse pour convertir automatiquement le 'Word (nums)' en un int; et ajouter des noms de résultats à la "pomme" et à la quantité "4" pour faciliter l'accès aux résultats analysés. – PaulMcG

+0

@Paul: J'ai interprété l'OP 'nest characters' avec' (...) '. En attente du commentaire OP ... – stovfl