¿Cuál es la forma más fácil en Python para reemplazar un carácter en una cadena?

Por ejemplo:

text = "abcdefg";
text[1] = "Z";
           ^
365
kostia 4 ago. 2009 a las 19:48

9 respuestas

La mejor respuesta

No modifique las cadenas.

Trabaja con ellos como listas; conviértalos en cadenas solo cuando sea necesario.

>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'

Las cadenas de Python son inmutables (es decir, no se pueden modificar). Hay muchas razones para esto. Use listas hasta que no tenga otra opción, solo luego conviértalas en cadenas.

516
scvalex 4 ago. 2009 a las 16:41

Si su mundo es 100% ascii/utf-8 (muchos casos de uso caben en ese cuadro):

b = bytearray(s, 'utf-8')
# process - e.g., lowercasing: 
#    b[0] = b[i+1] - 32
s = str(b, 'utf-8')

Python 3.7.3

0
Paul Nathan 17 sep. 2019 a las 17:44

En realidad, con cadenas, puedes hacer algo como esto:

oldStr = 'Hello World!'    
newStr = ''

for i in oldStr:  
    if 'a' < i < 'z':    
        newStr += chr(ord(i)-32)     
    else:      
        newStr += i
print(newStr)

'HELLO WORLD!'

Básicamente, estoy "agregando" + "cadenas" juntas en una nueva cadena :).

2
angelcool.net 20 nov. 2015 a las 21:46

Como han dicho otras personas, generalmente se supone que las cadenas de Python son inmutables.

Sin embargo, si está utilizando CPython, la implementación en python.org, es posible usar ctypes para modificar la estructura de la cadena en la memoria.

Aquí hay un ejemplo donde uso la técnica para borrar una cadena.

Marcar datos como sensibles en python

Menciono esto en aras de la integridad, y este debería ser su último recurso, ya que es hackish.

4
Community 23 may. 2017 a las 12:10

Este código no es mío. No podía recordar el sitio donde lo tomé. Curiosamente, puede usar esto para reemplazar un personaje o más con uno o más personajes. Aunque esta respuesta es muy tardía, los principiantes como yo (en cualquier momento) pueden encontrarla útil.

Cambiar la función de texto.

mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
3
K.Vee.Shanker. 16 dic. 2011 a las 13:39

Comenzando con python 2.6 y python 3, puede usar bytearrays que son mutables (se pueden cambiar por elementos a diferencia de las cadenas):

s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg

Editar: Cambiado str a s

Edit2: Como mencionó el alquimista de dos bits en los comentarios, este código no funciona con unicode.

13
Mahmoud 30 nov. 2015 a las 09:27

Método más rápido?

Hay tres formas Para los buscadores de velocidad recomiendo el 'Método 2'

Método 1

Dada por esta respuesta

text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)

Lo cual es bastante lento en comparación con el 'Método 2'

timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027

Método 2 (MÉTODO RÁPIDO)

Dada por esta respuesta

text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]

Lo cual es mucho más rápido:

timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195

Método 3:

Conjunto de bytes:

timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
190
Community 23 may. 2017 a las 10:31

Las cadenas de Python son inmutables, puede cambiarlas haciendo una copia.
La forma más fácil de hacer lo que quieres es probablemente.

text = "Z" + text[1:]

El texto [1:] devuelve la cadena en texto desde la posición 1 hasta el final, las posiciones cuentan desde 0, por lo que '1' es el segundo carácter.

Editar: puede usar la misma técnica de corte de cadena para cualquier parte de la cadena

text = text[:1] + "Z" + text[2:]

O si la letra solo aparece una vez, puede usar la técnica de búsqueda y reemplazo que se sugiere a continuación

35
Martin Beckett 4 ago. 2009 a las 16:04
new = text[:1] + 'Z' + text[2:]
127
Jochen Ritzel 16 ago. 2009 a las 19:30