Reemplazo de instancias de un carácter en una cadena

119

Este código simple que simplemente intenta reemplazar el punto y coma (en las posiciones especificadas por i) por dos puntos no funciona:

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

Da el error

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

¿Cómo puedo solucionar esto para reemplazar el punto y coma por dos puntos? El uso de reemplazar no funciona ya que esa función no toma índice; puede haber algunos puntos y comas que no quiero reemplazar.

Ejemplo

En la cadena podría tener cualquier número de punto y coma, por ejemplo, "¡Hei der!; Hola;!;"

Sé cuáles quiero reemplazar (tengo su índice en la cadena). El uso de reemplazar no funciona porque no puedo usar un índice con él.

El gato unfun
fuente
1
¿Conoce el str.replace()BIF?
LarsVegas
2
Sí, como expliqué en la pregunta. También le expliqué por qué eso no me funciona.
The Unfun Cat
Use en su str.find() lugar para encontrar la posición del punto y coma, luego use el corte para extraer la subcadena.
LarsVegas
1
Entonces, debe ser más específico en lo que constituye un reemplazo válido; su código que no funciona reemplazaría todos los puntos y comas en la cadena si fuera mutable.
Martijn Pieters
1
@TheUnfunCat: ¿Cómo está obteniendo los índices en primer lugar? Puede haber una mejor solución a todo el asunto (por ejemplo, expresiones regulares)
nneonneo

Respuestas:

206

Las cadenas en Python son inmutables, por lo que no puede tratarlas como una lista y asignarlas a índices.

Utilice en su .replace()lugar:

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

Si necesita reemplazar solo ciertos puntos y comas, deberá ser más específico. Puede usar el corte para aislar la sección de la cadena para reemplazar en:

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

Eso reemplazará todos los puntos y coma en los primeros 10 caracteres de la cadena.

Martijn Pieters
fuente
¿Funciona esto con caracteres Unicode? No parece funcionar para mí.
Steven2163712
@ Steven2163712: Todo el texto es Unicode, así que sí, funciona bien con todos los caracteres. Sin un ejemplo concreto, no puedo ayudarlo a solucionar su problema específico.
Martijn Pieters
62

Puede hacer lo siguiente, para reemplazar cualquier carácter con un carácter respectivo en un índice dado, si no desea utilizar .replace()

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

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

o/p: pythin
Dineshs91
fuente
7
Esta debe ser la respuesta aceptada, responde directamente a la pregunta. Este es el método más fácil que he encontrado hasta ahora.
Flare Cat
24

Convierta la cadena en una lista; entonces puedes cambiar los personajes individualmente. Entonces puedes volver a ponerlo junto con .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
neonneo
fuente
6

Si desea reemplazar un solo punto y coma:

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

Sin embargo, no lo he probado.

Vic
fuente
3
Esto funcionará (+1), pero es bastante ineficiente, ya que está creando una nueva cadena cada vez que encuentra un ';'
inspectorG4dget
@ inspectorG4dget, tiene razón, es una solución rápida y sucia, una sola vez.
Vic
En realidad, @ inspectorG4dget, ¿la respuesta aceptada no tiene el mismo problema?
Vic
2
line.replace(src,dst)no. line[:10].replace(src,dst) + line[10:]lo hace, pero con mucha menos severidad. Supongamos line = ';'*12. Su solución construirá una nueva cuerda 12 veces. La solución aceptada lo hará una vez.
inspectorG4dget
3

Esto debería cubrir un caso un poco más general, pero debería poder personalizarlo para su propósito

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)

Espero que esto ayude

inspectorG4dget
fuente
3

No se puede simplemente asignar valor a un carácter en la cadena. Utilice este método para reemplazar el valor de un carácter en particular:

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

Salida: In * ia

Además, si desea reemplazar, diga * para todas las apariciones del primer carácter excepto el primer carácter, por ejemplo. cadena = balbuceo salida = ba ** le

Código:

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

Si está reemplazando por un valor de índice especificado en la variable 'n', intente lo siguiente:

def missing_char(str, n):
 str=str.replace(str[n],":")
 return str
Bipin Shetty
fuente
1
El problema con esta solución es que reemplazaría todas las apariciones del carácter en la posición ny el autor de la pregunta solo quiere reemplazar esa ocurrencia específica
shivram.ss
Exactamente, ¡mala solución!
Erhard Dinhobl
1

Qué tal esto:

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')
Dylan Maulucci
fuente
1

Para usar el método .replace () de manera efectiva en una cadena sin crear una lista separada, por ejemplo, mire la lista de nombre de usuario que contiene una cadena con un espacio en blanco, queremos reemplazar el espacio en blanco con un guión bajo en cada una de las cadenas de nombre de usuario.

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

para reemplazar los espacios en blanco en cada nombre de usuario, considere usar la función range en Python.

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

print(usernames)
N.Samuel
fuente
0

Para reemplazar un carácter en un índice específico, la función es la siguiente:

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

donde s es una cadena, n es índice y c es un carácter.

Alquiler de Sanket
fuente
0

Escribí este método para reemplazar caracteres o reemplazar cadenas en una instancia específica. las instancias comienzan en 0 (esto se puede cambiar fácilmente a 1 si cambia el argumento inst opcional a 1 y la variable test_instance a 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
Matt Farguson
fuente
0

Puedes hacerlo:

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)
Shabgard Tanha
fuente
0

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

nombres de usuario = []

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

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay

Kasem007
fuente
1
Gracias, Muhammad. Soy un principiante. Haré lo mejor que pueda.
Kasem007