web-dev-qa-db-fra.com

Remplacer des occurrences d'un caractère dans une chaîne

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

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

Ça donne l'erreur 

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

Comment puis-je contourner ce problème pour remplacer les points-virgules par des deux points? Utiliser replace ne fonctionne pas car cette fonction ne prend aucun index - il peut y avoir des points-virgules que je ne souhaite pas remplacer.

Exemple

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

Je sais lesquels je veux remplacer (j'ai leur index dans la chaîne). Utiliser replace ne fonctionne pas car je ne parviens pas à utiliser un index.

76
The Unfun Cat

Les chaînes en python étant immuables, vous ne pouvez pas les traiter comme une liste et les affecter à des index.

Utilisez .replace() à la place:

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

Si vous devez remplacer uniquement certains points-virgules, vous devrez être plus spécifique. Vous pouvez utiliser le découpage en tranches pour isoler la section de la chaîne à remplacer dans:

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

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

136
Martijn Pieters

Vous pouvez faire ce qui suit pour remplacer un caractère par un autre à un index donné, si vous ne souhaitez pas utiliser .replace()

Word = 'python'
index = 4
char = 'i'

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

o/p: pythin
50
Dineshs91

Tournez la chaîne dans une liste; alors vous pouvez changer les caractères individuellement. Ensuite, vous pouvez le remettre 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
23
nneonneo

Si vous souhaitez remplacer un seul point-virgule:

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

Havent l'a testé cependant.

6
Vic

Cela devrait couvrir un cas légèrement plus général, mais vous devriez pouvoir le personnaliser pour 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)

J'espère que cela t'aides

3
inspectorG4dget

Vous ne pouvez pas simplement attribuer une valeur à un caractère de la chaîne. Utilisez cette méthode pour remplacer la valeur d’un caractère particulier:

name = "India"
result=name .replace("d",'*')

Sortie: en * ia

De même, si vous voulez remplacer, dites * pour toutes les occurrences du premier caractère sauf le premier, string = babble output = ba ** le

Code:

name = "babble"
front= name [0:1]
fromSecondCharacter = name [1:]
back=fromSecondCharacter.replace(front,'*')
return front+back
1
Darshan Jain

Si vous remplacez par une valeur d'index spécifiée dans la variable 'n', essayez ce qui suit:

def missing_char(str, n):
 str=str.replace(str[n],":")
 return str
1
Bipin Shetty

J'ai écrit cette méthode pour remplacer des caractères ou des chaînes à une instance spécifique. les instances commencent à 0 (cela peut facilement être modifié en 1 si vous modifiez l'argument optionnel inst en 1 et la variable test_instance en 1.

def replace_instance(some_Word, str_to_replace, new_str='', inst=0):
    return_Word = ''
    char_index, test_instance = 0, 0
    while char_index < len(some_Word):
        test_str = some_Word[char_index: char_index + len(str_to_replace)]
        if test_str == str_to_replace:
            if test_instance == inst:
                return_Word = some_Word[:char_index] + new_str + some_Word[char_index + len(str_to_replace):]
                break
            else:
                test_instance += 1
        char_index += 1
    return return_Word
0
Matt Farguson

Pour remplacer un caractère à un index spécifique, la fonction est la suivante:

def replace_char(s , n , c):
    n-=1
    s = s[0:n] + s[n:n+1].replace(s[n] , c) + s[n+1:]
    return s

où s est une chaîne, n est un index et c est un caractère.

0
Sanket Hire

Que dis-tu de ça:

sentence = 'After 1500 years of that thinking surpressed'

sentence = sentence.lower()

def removeLetter(text,char):

    result = ''
    for c in text:
        if c != char:
            result += c
    return text.replace(char,'*')
text = removeLetter(sentence,'a')
0
Dylan Maulucci