Cómo eliminar un carácter de una cadena usando Python


458

Hay una cadena, por ejemplo. EXAMPLE.

¿Cómo puedo eliminar el carácter del medio, es decir, Mde él? No necesito el código Quiero saber:

  • ¿Las cadenas en Python terminan en algún carácter especial?
  • ¿Cuál es una mejor manera: cambiar todo de derecha a izquierda a partir del carácter central O la creación de una nueva cadena y no copiar el carácter central?

Respuestas:


639

En Python, las cadenas son inmutables, por lo que debe crear una nueva cadena. Tiene algunas opciones sobre cómo crear la nueva cadena. Si desea eliminar la 'M' donde aparece:

newstr = oldstr.replace("M", "")

Si desea eliminar el carácter central:

midlen = len(oldstr)/2   # //2 in python 3
newstr = oldstr[:midlen] + oldstr[midlen+1:]

Usted preguntó si las cadenas terminan con un carácter especial. No, estás pensando como un programador en C. En Python, las cadenas se almacenan con su longitud, por lo que cualquier valor de byte, incluido \0, puede aparecer en una cadena.


16
Dado que el interrogador es nuevo en python, puede valer la pena señalar que, mientras que en la versión 2.X python el operador "/" devuelve un número entero (truncado hacia cero), en la versión 3.X python debe usar "//" en lugar. Además, la línea from __future__ import divisional comienzo de su script hará que la versión 2.X python actúe como la versión 3.X
Michael Dunn

1
Tenga en cuenta que si "M" es el único contenido de la línea, "" deja una línea vacía en su lugar.
8bitjunkie

1
@ 7SpecialGems depende completamente de lo que hagas con esta cadena. Una cadena vacía como ""no implica una línea vacía. Si lo pones en una lista y lo unes con nuevas líneas, formará una línea vacía, pero hay muchos otros lugares donde podrías usar una cadena vacía que no lo haga.
Ned Batchelder

68

Esta es probablemente la mejor manera:

original = "EXAMPLE"
removed = original.replace("M", "")

No te preocupes por cambiar de personaje y demás. La mayoría del código de Python tiene lugar en un nivel de abstracción mucho más alto.


66
MPuede que no sea único. En ese caso, esto reemplazará todos los Ms, ¿verdad?
Lazer

14
Si eso es correcto. Si solo desea reemplazar las nocurrencias, use original.replace("M", "", n).
recursivo

1
@ S.Lott Tomé eso como retórico, para sugerir proporcionar la solución para reemplazar solo una instancia
Dodgie

63

Para reemplazar una posición específica:

s = s[:pos] + s[(pos+1):]

Para reemplazar un personaje específico:

s = s.replace('M','')

18
Si bien esto puede funcionar, creo que su respuesta podría mejorarse al explicar lo que está sucediendo en la primera parte, ya que las operaciones de subcadenas no son necesariamente fáciles de entender para un novato de Python sin ninguna explicación.
jloubert

Entonces, si la longitud de s es l. Entonces, para la primera parte, la restricción para pos debería ser l-1 > pos >= 0.
Haoyu Chen

s [: pos] obtiene la subcadena de 0 a pos-1 y s [(pos + 1):] obtiene la subcadena de pos + 1 al final. Por lo tanto, elimina s [pos] de s.
s.singh

no se reemplaza, se cae. es bueno distinguir la operación proporcionando ejemplos para los dos casos de uso principales, separados por su método de selección de posición.
Alexander Stohr

28

Las cuerdas son inmutables. Pero puede convertirlos en una lista, que es mutable, y luego volver a convertir la lista en una cadena después de haberla cambiado.

s = "this is a string"

l = list(s)  # convert to list

l[1] = ""    # "delete" letter h (the item actually still exists but is empty)
l[1:2] = []  # really delete letter h (the item is actually removed from the list)
del(l[1])    # another way to delete it

p = l.index("a")  # find position of the letter "a"
del(l[p])         # delete it

s = "".join(l)  # convert back to string

También puede crear una nueva cadena, como han mostrado otros, tomando todo excepto el carácter que desee de la cadena existente.


44
¿Por qué no usarías el str.replacemétodo?
alichaudry

12

¿Cómo puedo eliminar el carácter del medio, es decir, M?

No puede, porque las cadenas en Python son inmutables .

¿Las cadenas en Python terminan en algún carácter especial?

No. Son similares a las listas de personajes; la longitud de la lista define la longitud de la cadena y ningún carácter actúa como un terminador.

¿Cuál es una mejor manera: cambiar todo de derecha a izquierda a partir del carácter central O la creación de una nueva cadena y no copiar el carácter central?

No puede modificar la cadena existente, por lo que debe crear una nueva que contenga todo excepto el carácter del medio.


11

Usa el translate()método:

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'

3
El método ha cambiado. Ver los documentos para Python 3: translate () Esto reemplaza diferentes caracteres con espacio ( Nonepara eliminar parece que no funciona):translate( str.maketrans("<>", " ") )
manejar

1
En realidad, los documentos especifican dos formas de eliminar diferentes caracteres con translate () en Python 3, str.maketrans( "", "", "<>")ystr.maketrans( {"<":None,">":None })
manejar

3
El equivalente del código en la respuesta se convirtió en esto en python3:'EXAMPLE'.translate({ord("M"): None})
yoniLavi

7

UserString.MutableString

Forma mutable:

import UserString

s = UserString.MutableString("EXAMPLE")

>>> type(s)
<type 'str'>

# Delete 'M'
del s[3]

# Turn it for immutable:
s = str(s)

3
Sitio web 404 sin importación
algo

6
card = random.choice(cards)
cardsLeft = cards.replace(card, '', 1)

Cómo eliminar un personaje de una cadena: Aquí hay un ejemplo en el que hay una pila de cartas representadas como personajes en una cadena. Se dibuja uno de ellos (importar módulo aleatorio para la función random.choice (), que selecciona un carácter aleatorio en la cadena). Se crea una nueva cadena, cardsLeft, para contener las tarjetas restantes dadas por la función de cadena replace () donde el último parámetro indica que solo una "tarjeta" debe ser reemplazada por la cadena vacía ...


6
def kill_char(string, n): # n = position of which character you want to remove
    begin = string[:n]    # from beginning to n (n not included)
    end = string[n+1:]    # n+1 through end of string
    return begin + end
print kill_char("EXAMPLE", 3)  # "M" removed

He visto esto en alguna parte aquí .


4

Esto es lo que hice para cortar la "M":

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]

2
Esto solo funcionaría con esta cadena específica y no es una solución general.
Andreas Bergström el

3

Si desea eliminar / ignorar caracteres en una cadena y, por ejemplo, tiene esta cadena,

"[11: L: 0]"

de una respuesta de API web o algo así, como un archivo CSV, supongamos que está utilizando solicitudes

import requests
udid = 123456
url = 'http://webservices.yourserver.com/action/id-' + udid
s = requests.Session()
s.verify = False
resp = s.get(url, stream=True)
content = resp.content

bucle y deshacerse de los caracteres no deseados:

for line in resp.iter_lines():
  line = line.replace("[", "")
  line = line.replace("]", "")
  line = line.replace('"', "")

División opcional, y podrá leer valores individualmente:

listofvalues = line.split(':')

Ahora acceder a cada valor es más fácil:

print listofvalues[0]
print listofvalues[1]
print listofvalues[2]

Esto imprimirá

11

L

0 0


3

Para eliminar una charo una sub-string vez (solo la primera vez):

main_string = main_string.replace(sub_str, replace_with, 1)

NOTA: Aquí 1puede reemplazarse por cualquiera intpor el número de veces que desea reemplazar.


3

Simplemente puede usar la comprensión de la lista.

Suponga que tiene la cadena: my name isy desea eliminar el carácter m. usa el siguiente código:

"".join([x for x in "my name is" if x is not 'm'])

0
from random import randint


def shuffle_word(word):
    newWord=""
    for i in range(0,len(word)):
        pos=randint(0,len(word)-1)
        newWord += word[pos]
        word = word[:pos]+word[pos+1:]
    return newWord

word = "Sarajevo"
print(shuffle_word(word))

2
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
andreas

0

Otra forma es con una función,

A continuación se muestra una forma de eliminar todas las vocales de una cadena, simplemente llamando a la función

def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")

-7

Las cadenas son inmutables en Python, por lo que ambas opciones significan básicamente lo mismo.

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.