Logique/algorithme et rechercher-remplacer avec des "chaînes soeurs"
Bonsoir,
Je suis actuellement confronté à un problème dont j'ai dû mal à trouver la solution même théorique.
Mon cas de figure est le suivant :
Je cherche à remplacer des chaînes par ces mêmes chaînes avec des guillemets en plus.
Pour cela, j'ai constitué un ""dictionnaire" en découpant mes chaînes par mots et en supprimant les doublons.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
import sys, string
ma_chaine_initiale="azerty uiop. (azerty) (uiop )ytreza qsdfg. hjklm)) (azertyyio.uiop) azertyy uiop ytreza qsdfgj hjklml"
#J'obtiens un dictionnaire comme ci-dessous
ma_liste_dict = ['azerty','uiop','ytreza','qsdfg','hjklm','azertyyio','azertyy','ytreza','qsdfgj','hjklml']
for item in ma_liste_dict:
ma_chaine_initiale = string.replace(ma_chaine_initiale,item,'"' + item + '"')
print ma_chaine_initiale |
J'obtiens un beau résultat :? :
Code:
1 2
| "azerty" "uiop". ("azerty") ("uiop" )""ytreza"" "qsdfg". "hjklm")) ("azerty"yio.
"uiop") "azerty"y "uiop" ""ytreza"" "qsdfg"j "hjklm"l |
Pour comprendre ce cas, je vais prendre le cas de la chaine azertyyio.
Dans ma boucle "for item in ma_liste_dict:", le rechercher-remplacer sur azertyyio me renvoie "azerty"yio car il a d'abord recherché sur azerty et à remplacé la chaine.
J'ai pensé solutionné le problème, en rangeant par ordre décroissant de longueur les chaînes du dictionnaire avec
ma_liste_dict = sorted(ma_liste_dict, key=len, reverse=True)
Bilan : il m'imbrique sur la chaîne azertyyio au fil de la boucle car les trois élements du rechercher-remplacer partage la même chaîne azerty
1er tour
"azertyyio"
2ème tour
""azertyy"io"
enfin 3ème tour
"""azertyy"io""
Il me faut une variable de contrôle pour dire à mon rechercher-remplacer de ne plus travailler là où il est déjà passé (il fait du zèle...). Vous auriez une idée comment procéder ? D'autres solutions alternatives pour résoudre un cas d'utilisation similaire au mien? Existe-t-il un algorithme pour ce cas ?
Merci de vos remarques (constructives bien entendues ;) )
gratiert
Merci