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.


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.


¿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

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

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.


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


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

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

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

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)

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.


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

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)

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


1
Gracias, Muhammad. Soy un principiante. Haré lo mejor que pueda.
Kasem007
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.