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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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