Y a-t-il un moyen beaucoup plus court d'écrire le code suivant?
my_string = my_string.replace('A', '1')
my_string = my_string.replace('B', '2')
my_string = my_string.replace('C', '3')
my_string = my_string.replace('D', '4')
my_string = my_string.replace('E', '5')
Notez que je n'ai pas besoin de ces valeurs exactes remplacées; Je cherche simplement un moyen de transformer 5 lignes ou plus en moins de 5 lignes
Cela ressemble à une bonne occasion d'utiliser une boucle:
mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
for k, v in mapping.iteritems():
my_string = my_string.replace(k, v)
Une approche plus rapide si les parenthèses ne vous dérange pas serait:
mapping = [ ('A', '1'), ('B', '2'), ('C', '3'), ('D', '4'), ('E', '5') ]
for k, v in mapping:
my_string = my_string.replace(k, v)
Vous pouvez facilement utiliser string.maketrans () pour créer la chaîne de mappage à transmettre à str.translate ():
import string
trans = string.maketrans("ABCDE","12345")
my_string = my_string.translate(trans)
Regardez aussi dans str.translate()
. Il remplace les caractères en fonction du mappage que vous fournissez pour les chaînes Unicode, ou doit indiquer autrement le remplacement des caractères de chr (0) à chr (255).
Si vous voulez obtenir la mauvaise réponse, lentement, utilisez string.replace dans une boucle. (Bien que cela fonctionne dans ce cas, il n'y a pas de chevauchement entre les modèles et les remplacements.)
Pour le cas général avec des chevauchements possibles ou une longue chaîne de sujet, utilisez re.sub:
import re
def multisub(subs, subject):
"Simultaneously perform all substitutions on the subject string."
pattern = '|'.join('(%s)' % re.escape(p) for p, s in subs)
substs = [s for p, s in subs]
replace = lambda m: substs[m.lastindex - 1]
return re.sub(pattern, replace, subject)
>>> multisub([('hi', 'bye'), ('bye', 'hi')], 'hi and bye')
'bye and hi'
Dans le cas particulier de modèles à 1 caractère et de remplacements à 1 ou 0 caractères, utilisez string.maketrans.
replaceDict = {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'} pour la clé , remplacement dans replaceDict.items (): my_string = my_string.replace (clé, remplacement)
Une façon dont je le fais est avec un tableau associé (un dictionnaire). Voici un exemple des remplacements que j'utilise lors de la préparation d'un fichier en vue de son déploiement dans LaTeX à l'aide d'expressions régulières.
import re
def escapeTexString(string): # Returns TeX-friendly string
rep = { # define desired replacements in this dictionary (mapping)
'&': '\\&',
'%': '\\%',
'#': '\\#',
'_': '\\_',
'{': '\\{', # REGEX Special
'}': '\\}', # REGEX Special
'~': '\\char"007E{}', # LaTeX Special
'$': '\\$', # REGEX Special
'\\': '\\char"005C{}', # REGEX/LaTeX Special
'^': '\\char"005E{}', # REGEX/LaTeX Special
'"': '\\char"FF02{}'
}
# use these two lines to do the replacement (could be shortened to one line)
pattern = re.compile("|".join(map(re.escape,rep.keys()))) # Create single pattern object (key to simultaneous replacement)
new_string = pattern.sub(lambda match: rep[match.group(0)], string)
return new_string