Apparemment, ce problème arrive assez souvent, après avoir luanalyse syntaxique entre parenthèses imbriquées en python, le contenu grab par niveau
Regular expression to detect semi-colon terminated C++ for & while loops
et la réflexion sur le problème pendant un certain temps, je l'ai écrit une fonction pour renvoyer le contenu contenu à l'intérieur d'un nombre arbitraire d'imbriqués()
La fonction pourrait facilement être étendue à n'importe quel objet d'expression régulière, en postant ici pour vos pensées et considérations.
des conseils de refactoring serait apprécié
(note, je suis nouveau à python toujours, et n'a pas envie de trouver comment générant des exceptions ou autre chose, donc je viens d'avoir le retour de la fonction « échec » si elle couldin't comprendre ce qui se passait)
fonction modifiée pour prendre en compte les commentaires:
def ParseNestedParen(string, level):
"""
Return string contained in nested(), indexing i = level
"""
CountLeft = len(re.findall("\(", string))
CountRight = len(re.findall("\)", string))
if CountLeft == CountRight:
LeftRightIndex = [x for x in zip(
[Left.start()+1 for Left in re.finditer('\(', string)],
reversed([Right.start() for Right in re.finditer('\)', string)]))]
elif CountLeft > CountRight:
return ParseNestedParen(string + ')', level)
elif CountLeft < CountRight:
return ParseNestedParen('(' + string, level)
return string[LeftRightIndex[level][0]:LeftRightIndex[level][1]]
Le comportement associé à ParseNestedParen ('(a) (b) (c)', 0) est réellement correct, mais ma fonction est le mauvais outil pour le travail, j'ai écrit la fonction avec string = "some_function (another_function (some_argument)) " à l'esprit. pourquoi retourner dans une liste? ne devrait pas avoir. bon point, merci! quand vais-je retourner échouer? Je ne sais pas. peut-être jamais. est-il à partir de quand je codais la fonction appel réitéré trouver tout est gaspillage? Donc devrais-je juste faire la liste countparen = [re.findall (str) pour str en ["\ (", "\)"]] et l'utiliser à la place? comment sinon rééquilibrer la parenthèse? merci pour les commentaires! –
Il est difficile de dire quelle est la bonne chose à faire à propos des parenthèses déséquilibrées, parce que je ne sais pas à quoi la fonction va servir. Les chaînes les plus susceptibles d'être déséquilibrées sont une sorte d'erreur d'entrée, et doivent être soit ignorées (pour des applications comme la coloration syntaxique), soit élevées comme des erreurs (pour des applications comme la compilation). –