Agregar cadena en una determinada posición en Python

157

¿Hay alguna función en Python que pueda usar para insertar un valor en una determinada posición de una cadena?

Algo como esto:

"3655879ACB6"luego en la posición 4 agregue "-"para convertirse"3655-879ACB6"

Michel Andrade
fuente

Respuestas:

272

No. Las cadenas de Python son inmutables.

>>> s='355879ACB6'
>>> s[4:4] = '-'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

Sin embargo, es posible crear una nueva cadena que tenga el carácter insertado:

>>> s[:4] + '-' + s[4:]
'3558-79ACB6'
Ignacio Vazquez-Abrams
fuente
9
Además de esto, podría usar índices negativos para obtener una posición desde la derecha, por ejemplos[:-4]
Reuben L.
Utilizando el lenguaje de cadenas de formato más nuevo: '{0} - {1}'. Format (s [: 4], s [4:])
srock
60

Esto parece muy fácil:

>>> hash = "355879ACB6"
>>> hash = hash[:4] + '-' + hash[4:]
>>> print hash
3558-79ACB6

Sin embargo, si le gusta algo como una función, haga lo siguiente:

def insert_dash(string, index):
    return string[:index] + '-' + string[index:]

print insert_dash("355879ACB6", 5)
Mario César
fuente
26

Como las cadenas son inmutables, otra forma de hacerlo sería convertir la cadena en una lista, que luego se puede indexar y modificar sin ningún tipo de truco de corte. Sin embargo, para volver la lista a una cadena, debe usar .join()una cadena vacía.

>>> hash = '355879ACB6'
>>> hashlist = list(hash)
>>> hashlist.insert(4, '-')
>>> ''.join(hashlist)
'3558-79ACB6'

No estoy seguro de cómo se compara esto en cuanto al rendimiento, pero creo que es más fácil a la vista que las otras soluciones. ;-)

jathanism
fuente
7

Función simple para lograr esto:

def insert_str(string, str_to_insert, index):
    return string[:index] + str_to_insert + string[index:]
vatsug
fuente
5

He creado un método muy útil para agregar una cadena en una determinada posición en Python :

def insertChar(mystring, position, chartoinsert ):
    longi = len(mystring)
    mystring   =  mystring[:position] + chartoinsert + mystring[position:] 
    return mystring  

por ejemplo:

a = "Jorgesys was here!"

def insertChar(mystring, position, chartoinsert ):
    longi = len(mystring)
    mystring   =  mystring[:position] + chartoinsert + mystring[position:] 
    return mystring   

#Inserting some characters with a defined position:    
print(insertChar(a,0, '-'))    
print(insertChar(a,9, '@'))    
print(insertChar(a,14, '%'))   

tendremos como salida:

-Jorgesys was here!
Jorgesys @was here!
Jorgesys was h%ere!
Jorgesys
fuente
8
¿Por qué calculas la longitud de la cuerda?
Yytsi
2
Tal vez quería comprobar que el índice tenía menos de la longitud de la cadena ... y luego se olvidó.
sce
Python usa convencionalmente mayúsculas y minúsculas para nombres de funciones, no mayúsculas y minúsculas.
Michael Bates
2

Creo que las respuestas anteriores están bien, pero explicaría que hay algunos efectos secundarios inesperados pero buenos para ellos ...

def insert(string_s, insert_s, pos_i=0):
    return string_s[:pos_i] + insert_s + string_s[pos_i:]

Si el índice pos_i es muy pequeño (demasiado negativo), la cadena de inserción se antepone. Si es demasiado largo, la cadena de inserción se agrega. Si pos_i está entre -len (string_s) y + len (string_s) - 1, la cadena de inserción se inserta en el lugar correcto.

Gary02127
fuente
0

Python 3.6+ usando f-string:

mys = '1362511338314'
f"{mys[:10]}_{mys[10:]}"

da

'1362511338_314'
DarinP
fuente
-3

Si quieres muchas inserciones

from rope.base.codeanalyze import ChangeCollector

c = ChangeCollector(code)
c.add_change(5, 5, '<span style="background-color:#339999;">')
c.add_change(10, 10, '</span>')
rend_code = c.get_changed()
enomad
fuente
No me queda claro de dónde proviene la biblioteca que está importando o cuál sería el resultado.
chrisfs