Après avoir trouvé l'algorithme de remplacement de chaîne le plus rapide en this thread, j'ai essayé de modifier l'un d'entre eux pour répondre à mes besoins, notamment this one par gnibbler. Je vais expliquer à nouveau le problème ici, et quel problème je suis en train de vivre.Expression régulière à fractionner sur un caractère spécifique SEULEMENT si ce caractère n'est pas dans une paire
Dire que j'ai une chaîne qui ressemble à ceci:
str = "The &yquick &cbrown &bfox &Yjumps over the &ulazy dog"
Vous remarquerez beaucoup d'endroits dans la chaîne où il y a une esperluette, suivi d'un caractère (comme « & y » et "& c"). Je dois remplacer ces caractères avec une valeur appropriée que j'ai dans un dictionnaire, comme ceci:
dict = {"y":"\033[0;30m",
"c":"\033[0;31m",
"b":"\033[0;32m",
"Y":"\033[0;33m",
"u":"\033[0;34m"}
solution à l'aide gnibblers fournie dans mon précédent fil, j'ai ce que ma solution actuelle:
myparts = tmp.split('&')
myparts[1:]=[dict.get(x[0],"&"+x[0])+x[1:] for x in myparts[1:]]
result = "".join(myparts)
Cela fonctionne pour remplacer les caractères correctement, et n'échoue pas sur les caractères qui ne sont pas trouvés. Le seul problème avec ceci est qu'il n'y a aucun moyen simple pour effectivement garder une perluète dans la sortie. La meilleure façon que je pouvais penser serait de changer mon dictionnaire pour contenir:
dict = {"y":"\033[0;30m",
"c":"\033[0;31m",
"b":"\033[0;32m",
"Y":"\033[0;33m",
"u":"\033[0;34m",
"&":"&"}
Et changer mon appel « split » pour faire une scission regex sur esperluette qui ne sont pas suivies par d'autres esperluette.
>>> import re
>>> tmp = "&yI &creally &blove A && W &uRootbeer."
>>> tmp.split('&')
['', 'yI ', 'creally ', 'blove A ', '', ' W ', 'uRootbeer.']
>>> re.split('MyRegex', tmp)
['', 'yI ', 'creally ', 'blove A ', '&W ', 'uRootbeer.']
Fondamentalement, je besoin d'une expression rationnelle qui va diviser le premier esperluette d'une paire, et chaque unique esperluette, pour me permettre d'échapper via mon dictionnaire.
Si quelqu'un a de meilleures solutions s'il vous plaît n'hésitez pas à me le faire savoir.
Mike, je suis un peu perplexe (mais pas mal personnellement) pourquoi ne pas utiliser ma solution de cette autre question. Il s'est avéré être le plus rapide sur les données réelles, * a * la propriété de garder des esperluettes réelles dans la sortie, et est certainement parmi les plus lisibles des réponses données. –
Peter: La raison en est que je n'avais pas encore lu votre commentaire sur la raison pour laquelle je recevais les erreurs que j'étais et que je n'ai pas trouvé de solution au moment où j'ai eu besoin d'écrire ce code. Maintenant que je vois vos commentaires, il est probable que je vais changer le code pour utiliser votre solution plus rapide et plus lisible. –