Python Eliminar los últimos 3 caracteres de una cadena


146

Estoy tratando de eliminar los últimos 3 caracteres de una cadena en Python, no sé cuáles son estos caracteres, así que no puedo usarlos rstrip, también necesito eliminar cualquier espacio en blanco y convertirlos a mayúsculas

Un ejemplo sería:

foo = "Bs12 3ab"
foo.replace(" ", "").rstrip(foo[-3:]).upper()

Esto funciona y me da BS12, que es lo que quiero, sin embargo, si los últimos 4 ° y 3 ° caracteres son iguales, pierdo ambos, por ejemplo, si foo = "BS11 1AA"solo obtengo'BS'

ejemplos de foopodrían ser:

BS1 1AB
bs11ab
BS111ab

La cadena podría tener 6 o 7 caracteres y necesito soltar los últimos 3 (suponiendo que no haya espacios en blanco)

¿Algun consejo?

Respuestas:


278

Eliminando todos los espacios en blanco:

foo = ''.join(foo.split())

Eliminando los últimos tres caracteres:

foo = foo[:-3]

Convertir a mayúsculas:

foo = foo.upper()

Todo ese código en una línea:

foo = ''.join(foo.split())[:-3].upper()

9
Me gustaría señalar que ''.join(foo.split())es mejor que foo.replace(' ', ''), cuando se usa en cadenas Unicode porque elimina cualquier carácter de espacio en blanco , además del ' 'carácter (en particular, también se eliminan los espacios que no se rompen). Dicho esto replace()probablemente sea mucho más rápido, por lo que se puede usar si, por ejemplo, se sabe que las cadenas de entrada están codificadas en ASCII, que solo tiene un carácter de espacio (estoy usando la terminología de Python 2, aquí)
Eric O Lebigot

90

No funciona como se espera porque la tira está basada en caracteres. Necesitas hacer esto en su lugar:

foo = foo.replace(' ', '')[:-3].upper()

11
Eso no elimina WHITESPACE como lo solicitó el OP; solo elimina los caracteres de ESPACIO.
John Machin el

15
>>> foo = "Bs12 3ab"
>>> foo[:-3]
'Bs12 '
>>> foo[:-3].strip()
'Bs12'
>>> foo[:-3].strip().replace(" ","")
'Bs12'
>>> foo[:-3].strip().replace(" ","").upper()
'BS12'

2
@Lidia Sí, la tira solo elimina espacios en blanco desde el principio y el final de la cadena.
Eliezer Miron

Cabe señalar que no se puede encadenar esto, por ejemplo foo [3:] foo [: - 3]
crafter

9

Es posible que haya malinterpretado ligeramente rstrip, no elimina una cadena sino cualquier carácter de la cadena que especifique.

Me gusta esto:

>>> text = "xxxxcbaabc"
>>> text.rstrip("abc")
'xxxx'

Entonces, en lugar de eso, solo usa

text = text[:-3] 

(después de reemplazar el espacio en blanco con nada)


3
>>> foo = 'BS1 1AB'
>>> foo.replace(" ", "").rstrip()[:-3].upper()
'BS1'

3

Intento evitar expresiones regulares, pero esto parece funcionar:

string = re.sub("\s","",(string.lower()))[:-3]


1
string.lower () debe ser string.upper (). Mi error.
krs1

esta es la única solución que aborda bien los espacios en blanco
Erik Aronesty

1

¿Qué tiene de malo esto?

foo.replace(" ", "")[:-3].upper()

1
  1. split
  2. slice
  3. concentrate

Este es un buen entrenamiento para principiantes y es fácil de lograr.

Otro método avanzado es una función como esta:

def trim(s):
    return trim(s[slice])

Y para esta pregunta, solo desea eliminar los últimos caracteres, para que pueda escribir así:

def trim(s):
    return s[ : -3] 

Creo que te preocupan cuáles son esos tres personajes, así que perdiste. ¡Solo desea eliminar los últimos tres, sin embargo, quiénes son!

Si desea eliminar algunos caracteres específicos, puede agregar algunos juicios if:

def trim(s):
    if [conditions]:   ### for some cases, I recommend using isinstance().
        return trim(s[slice])

0

¿No estás realizando las operaciones en el orden incorrecto? Tu requisito parece serfoo[:-3].replace(" ", "").upper()


señala lo siguiente en la pregunta >>> (suponiendo que no haya espacios en blanco)
Noctis Skytower

0

Depende de su definición de espacio en blanco. En general, llamaría espacios en blanco como espacios, tabulaciones, saltos de línea y retornos de carro. Si esta es su definición, desea utilizar una expresión regular con \ s para reemplazar todos los caracteres de espacios en blanco:

import re

def myCleaner(foo):
    print 'dirty: ', foo
    foo = re.sub(r'\s', '', foo)
    foo = foo[:-3]
    foo = foo.upper()
    print 'clean:', foo
    print

myCleaner("BS1 1AB")
myCleaner("bs11ab")
myCleaner("BS111ab")
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.