l'analyse des parenthèses imbriquées dans python, récupérez le contenu par niveau
Apparemment ce problème arrive assez souvent, après la lecture de
Expression régulière pour détecter semi-colon C++ terminée pour & tandis que les boucles
et la réflexion sur le problème pendant un certain temps, j'ai écrit une fonction pour renvoyer le contenu à l'intérieur d'un nombre arbitraire de imbriquée ()
La fonction pourrait facilement être étendu à toute expression régulière de l'objet, de poster ici pour vos pensées et considérations.
tout refactoring conseils seraient appréciés
(remarque, je suis nouveau sur python encore, et n'avait pas envie de chercher comment lever des exceptions ou que ce soit, donc j'ai juste eu le retour de la fonction "erreur" si on couldin pas comprendre ce qui se passait)
Modifié 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]]
source d'informationauteur justin cress
Vous devez vous connecter pour publier un commentaire.
Vous ne le faites pas clair exactement ce que les spécifications de votre fonction, mais ce comportement semble mal pour moi:
D'autres commentaires sur votre code:
fail
?re.findall
puis jeter le résultat, c'est du gaspillage.Comme Thomi dit dans le question-vous liés à"les expressions régulières sont vraiment le mauvais outil pour le travail!"
La manière habituelle pour analyser des expressions imbriquées est d'utiliser une pile, le long de ces lignes:
Tests:
de sortie:
Parenthèses correspondant nécessite un analyseur avec un push-down automate. Certaines bibliothèques existent, mais les règles sont assez simples pour que l'on puisse l'écrire à partir de zéro: