2010-08-23 32 views
5

¿Cómo reemplazar un conjunto de caracteres dentro de otra cadena en Python?cómo sustituir parte de una cadena en python?

Aquí es lo que estoy tratando de hacer: Digamos que tengo una cadena 'abcdefghijkl' y quiere reemplazar el 2-d desde el símbolo final (k) con A. Recibo un error:

>>> aa = 'abcdefghijkl' 
>>> print aa[-2] 
k 
>>> aa[-2]='A' 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    aa[-2]='A' 
TypeError: 'str' object does not support item assignment 

Entonces, la pregunta: ¿hay una forma elegante de reemplazar (sustituir) con símbolos de una cadena dentro de otra cadena comenzando desde la posición especificada? Algo como:

# subst(whole_string,symbols_to_substiture_with,starting_position) 

>>> print aa 
abcdefghijkl 
>>> aa = subst(aa,'A',-2) 
>>> print aa 
abcdefghijAl 

¿Cuál sería un código de fuerza no bruta para el subst?

+0

http://stackoverflow.com/questions/3463746/in-place-string-modifications-in-python/3463847#3463847 – killown

Respuesta

12

Si es siempre la misma posición que está reemplazando, usted podría hacer algo como:

>>> s = s[0:-2] + "A" + s[-1:] 
>>> print s 
abcdefghijAl 

En el caso general, se puede hacer:

>>> rindex = -2 #Second to the last letter 
>>> s = s[0:rindex] + "A" + s[rindex+1:] 
>>> print s 
abcdefghijAl 

Editar: El muy caso general, si solo desea repetir una sola letra en el reemplazo:

>>> s = "abcdefghijkl" 
>>> repl_str = "A" 
>>> rindex = -4 #Start at 4th character from the end 
>>> repl = 3 #Replace 3 characters 
>>> s = s[0:rindex] + (repl_str * repl) + s[rindex+repl:] 
>>> print s 
abcdefghAAAl 
+0

¿Qué sucede si la sustitución es más larga que 1 símbolo? 'AAA' en lugar de 'A'. Y necesito reemplazar tres símbolos en la cadena original (no uno con tres, sino la misma longitud que la sustitución). – user63503

+0

@photographer: Ver mi edición. – eldarerathis

8
TypeError: 'str' object does not support item assignment 

Esto es de esperar, las cadenas de pitón son inmutables.

Una forma es cortar en rodajas y cortar en cubitos. De esta manera:

>>> aa = 'abcdefghijkl' 
>>> changed = aa[0:-2] + 'A' + aa[-1] 
>>> print changed 
abcdefghijAl 

El resultado de la concatenación, changed habrá otra cadena inmutable. Eso sí, esta no es una solución genérica que se ajuste a todos los escenarios de sustitución.

+0

Te falta el carácter 'l'. – sholsapp

+0

@gnucom: Gracias. Arreglado. –

+0

+1. Gracias por eso. – sholsapp

4

Hay que cortarlo y crear instancias de una nueva cadena ya que las cadenas son inmutables:

aa = aa[:-2] + 'A' + aa[-1:] 
1

Otra manera de hacer esto:

s = "abcdefghijkl" 
l = list(s) 
l[-2] = 'A' 
s = "".join(l) 

cadenas en Python son secuencias inmutables - muy parecido a tuplas. Puede hacer una lista, que sea mutable, de cadena o tupla, cambiar índices relevantes y transformar la lista de nuevo en cadena con join o en tuple con constructor tuple.

EDIT: en el caso de las cadenas puede utilizar bytearray (docs) tipo en lugar de list, lo que hace que la transformación en cadena es posible con str constructor.

Además, se podría implementar su propio o utilizar esta clase de biblioteca estándar: http://docs.python.org/library/userdict.html#UserString.MutableString así:

>>> from UserString import MutableString 
>>> s = MutableString("zdfgzbdr ") 
>>> s 
'zdfgzbdr ' 
>>> s[1:5] 
'dfgz' 
>>> s[1:5] = "xxxx" 
>>> s 
'zxxxxbdr ' 

Lamentablemente - MutableString es obsoleto y no disponible en Py3k (todavía se puede escribir su propia clase, pensar).

+0

Anímate, todavía tienes 'bytearray' –

+0

@gnibbler Estoy sorprendido. No sabía que este tipo existe, gracias. – cji

1

Para responder comentarios de otros post:

hacer tres sustitución de caracteres directamente con cuerdas (véase también el cargo bytearray) que puede hacer la partición con la secuencia, especialmente si usted no sabe la posición sin búsqueda:

aa = 'abcdefghijkl' 
replace = 'def' 
withstring = 'QRS' 
newstr,found,endpart = aa.partition(replace) 

if found: 
    newstr+=withstring+endpart 
    print newstr 
else: 
    print "%r string is not in %r" % (replace,aa) 

No es necesario que la longitud de la sustitución coincida con el original en este caso.

Cuestiones relacionadas