Sostituzione di istanze di un carattere in una stringa


119

Questo semplice codice che cerca semplicemente di sostituire i punti e virgola (nelle posizioni specificate da i) con i due punti non funziona:

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

Dà l'errore

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

Come posso aggirare questo problema per sostituire il punto e virgola con i due punti? L'utilizzo di sostituzione non funziona in quanto tale funzione non accetta alcun indice: potrebbero esserci dei punti e virgola che non voglio sostituire.

Esempio

Nella stringa potrei avere un numero qualsiasi di punti e virgola, ad esempio "Hei der!; Hello there;!;"

So quali voglio sostituire (ho il loro indice nella stringa). L'uso della sostituzione non funziona poiché non sono in grado di utilizzare un indice con esso.


1
Conosci il str.replace()BIF?
LarsVegas

2
Sì, come ho spiegato nella domanda. Ho anche spiegato perché questo non funziona per me.
The Unfun Cat

Utilizzare str.find() invece per trovare la posizione del punto e virgola, quindi utilizzare l'affettatura per estrarre la sottostringa.
LarsVegas

1
È necessario essere più specifici in ciò che costituisce un valido sostituto quindi; il tuo codice non funzionante sostituirebbe tutti i punti e virgola nella stringa se fosse modificabile.
Martijn Pieters

1
@TheUnfunCat: In primo luogo come stai ottenendo gli indici? Potrebbe esserci una soluzione migliore per l'intera faccenda (es
Espressioni regolari

Risposte:


206

Le stringhe in python sono immutabili, quindi non puoi trattarle come un elenco e assegnarle agli indici.

Usa .replace()invece:

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

Se devi sostituire solo alcuni punti e virgola, dovrai essere più specifico. È possibile utilizzare l'affettatura per isolare la sezione della stringa da sostituire in:

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

Questo sostituirà tutti i punti e virgola nei primi 10 caratteri della stringa.


Funziona con i caratteri Unicode? Non sembra funzionare per me.
Steven2163712

@ Steven2163712: Tutto il testo è Unicode, quindi sì, funziona bene con tutti i caratteri. Senza un esempio concreto non posso aiutarti a risolvere il tuo problema specifico.
Martijn Pieters

62

Puoi fare quanto segue, per sostituire qualsiasi carattere con un rispettivo carattere in un dato indice, se non desideri utilizzarlo .replace()

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

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

o/p: pythin

7
Questa dovrebbe essere la risposta accettata, risponde direttamente alla domanda. Questo è il metodo più semplice che ho trovato finora.
Flare Cat

24

Trasforma la stringa in una lista; quindi puoi cambiare i caratteri individualmente. Quindi puoi rimetterlo insieme a .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

6

Se vuoi sostituire un singolo punto e virgola:

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

Non l'ho provato però.


3
Funzionerà (+1), ma è abbastanza inefficiente, poiché crei una nuova stringa ogni volta che incontri un ";"
inspector

@ inspectorG4dget, hai ragione, è una soluzione rapida e sporca, una volta sola.
Vic

In realtà, @ inspectorG4dget, la risposta accettata non soffre dello stesso problema?
Vic

2
line.replace(src,dst)non. line[:10].replace(src,dst) + line[10:]lo fa, ma con molta meno gravità. Supponiamo line = ';'*12. La tua soluzione creerà una nuova stringa 12 volte. La soluzione accettata lo farà una volta.
inspector

3

Questo dovrebbe coprire un caso leggermente più generale, ma dovresti essere in grado di personalizzarlo per il tuo scopo

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)

Spero che questo ti aiuti


3

Non puoi semplicemente assegnare un valore a un carattere nella stringa. Usa questo metodo per sostituire il valore di un carattere particolare:

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

Uscita: in * ia

Inoltre, se vuoi sostituire dì * per tutte le occorrenze del primo carattere tranne il primo carattere, ad es. stringa = balbettio output = ba ** le

Codice:

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

1

Se stai sostituendo con un valore di indice specificato nella variabile 'n', prova quanto segue:

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

1
Il problema con questa soluzione è che sostituirebbe tutte le occorrenze del carattere nella posizione ne asker vuole solo sostituire quella specifica occorrenza
shivram.ss

Esatto, pessima soluzione!
Erhard Dinhobl

1

Cosa ne pensi di questo:

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

1

per utilizzare il metodo .replace () in modo efficace su una stringa senza creare un elenco separato, ad esempio dai un'occhiata al nome utente dell'elenco contenente la stringa con un po 'di spazio bianco, vogliamo sostituire lo spazio bianco con un trattino basso in ciascuna stringa del nome utente.

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

per sostituire gli spazi bianchi in ogni nome utente, considera l'utilizzo della funzione range in python.

for i in range(len(usernames)):
    usernames[i] = usernames[i].lower().replace(" ", "_")

print(usernames)

0

Per sostituire un carattere a un indice specifico, la funzione è la seguente:

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

dove s è una stringa, n è indice ec è un carattere.


0

Ho scritto questo metodo per sostituire i caratteri o sostituire le stringhe in un'istanza specifica. le istanze iniziano da 0 (questo può essere facilmente modificato in 1 se si modifica l'argomento opzionale inst in 1 e la variabile test_instance in 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

Puoi farlo:

string = "this; is a; sample; ; python code;!;" #your desire string
result = ""
for i in range(len(string)):
    s = string[i]
    if (s == ";" and i in [4, 18, 20]): #insert your desire list
        s = ":"
    result = result + s
print(result)

0

nomi = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

nomi utente = []

for i in names:
    if " " in i:
        i = i.replace(" ", "_")
    print(i)

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay


1
Grazie, Muhammad io sono un principiante farò del mio meglio.
Kasem007
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.