194 votes

Remplacer les instances d'un caractère dans une chaîne de caractères

Ce code simple qui essaie simplement de remplacer les points-virgules (à des positions i-spécifiées) par des deux-points ne fonctionne pas :

for i in range(0,len(line)):
     if (line[i]==";" and i in rightindexarray):
         line[i]=":"

Il donne l'erreur

line[i]=":"
TypeError: 'str' object does not support item assignment

Comment puis-je contourner ce problème en remplaçant les points-virgules par des deux-points ? L'utilisation de replace ne fonctionne pas car cette fonction ne prend pas d'index - il peut y avoir des points-virgules que je ne veux pas remplacer.

Exemple

Dans la chaîne de caractères, je peux avoir un nombre quelconque de points-virgules, par exemple "Hei der ! ; Hello there ;! ;".

Je sais quels sont ceux que je veux remplacer (j'ai leur index dans la chaîne). L'utilisation de replace ne fonctionne pas car je ne suis pas en mesure d'utiliser un index avec lui.

326voto

Martijn Pieters Points 271458

Les chaînes de caractères en python sont immuables, vous ne pouvez donc pas les traiter comme une liste et les assigner à des indices.

Utilice .replace() à la place :

line = line.replace(';', ':')

Si vous devez remplacer uniquement certains points-virgules, vous devrez être plus précis. Vous pourriez utiliser le découpage pour isoler la section de la chaîne à remplacer :

line = line[:10].replace(';', ':') + line[10:]

Cela remplacera tous les points-virgules dans les 10 premiers caractères de la chaîne.

73voto

Dineshs91 Points 765

Vous pouvez faire ce qui suit, pour remplacer n'importe quel caractère par un caractère respectif à un index donné, si vous ne souhaitez pas utiliser la fonction .replace()

word = 'python'
index = 4
char = 'i'

word = word[:index] + char + word[index + 1:]
print word

o/p: pythin

24voto

nneonneo Points 56821

Transformez la chaîne de caractères en une liste ; vous pouvez ensuite modifier les caractères individuellement. Vous pouvez ensuite la reconstituer avec .join :

s = 'a;b;c;d'
slist = list(s)
for i, c in enumerate(slist):
    if slist[i] == ';' and 0 <= i <= 3: # only replaces semicolons in the first part of the text
        slist[i] = ':'
s = ''.join(slist)
print s # prints a:b:c;d

7voto

Vic Points 4580

Si vous voulez remplacer un seul point-virgule :

for i in range(0,len(line)):
 if (line[i]==";"):
     line = line[:i] + ":" + line[i+1:]

Je ne l'ai pas encore testé.

3voto

inspectorG4dget Points 25092

Cela devrait couvrir un cas un peu plus général, mais vous devriez être en mesure de l'adapter à vos besoins.

def selectiveReplace(myStr):
    answer = []
    for index,char in enumerate(myStr):
        if char == ';':
            if index%2 == 1: # replace ';' in even indices with ":"
                answer.append(":")
            else:
                answer.append("!") # replace ';' in odd indices with "!"
        else:
            answer.append(char)
    return ''.join(answer)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X