web-dev-qa-db-fra.com

Une liste de remplacements de chaînes en Python

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

27
Teifion

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)
52
Rick Copeland

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)
40
Matthew Schinckel

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).

15
Artelius

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.

11
Darius Bacon
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)
8
Stefan Kendall

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
0
Jonathan Komar