2009-11-25 31 views
78

Estoy tratando de eliminar los últimos 3 caracteres de una cadena en python, no sé cuáles son estos caracteres, así que no puedo usar rstrip, también necesito eliminar cualquier espacio en blanco y convertir a mayúsculasPython Eliminar los últimos 3 caracteres de una cadena

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º & 3ª personajes son los mismos pierdo tanto por ejemplo, si foo = "BS11 1AA" acabo de obtener 'BS'

ejemplos de foo podrían ser:

BS1 1AB 
bs11ab 
BS111ab 

La cadena podría ser de 6 o 7 caracteres y tengo que soltar el último 3 (suponiendo que no hay espacio en blanco)

Algún consejo?

+7

de noctis es mejor. solo digo. – Cinder

+1

No mire la respuesta aceptada, baje verá la respuesta de notics –

Respuesta

131

Extracción de cualquier y todos los espacios en blanco:

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

Eliminando últimos tres caracteres:

foo = foo[:-3] 

la conversión a mayúsculas:

foo = foo.upper() 

Todo ese código en una sola línea:

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

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 * whitespace *, además del carácter '''' (en particular, los espacios sin interrupción también se eliminan). Dicho esto, 'replace()' es probablemente 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 (aquí estoy usando la terminología de Python 2). – EOL

85

No funciona como esperaba porque la tira está basada en caracteres. En su lugar, necesita hacer esto:

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

Eso no quita WHITESPACE como solicitó OP; solo elimina los caracteres SPACE. –

1

¿Qué pasa con esto?

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

Es posible que haya entendido mal rstrip poco, no tiras una cadena pero cualquier carácter en la cadena que especifique.

De esta manera:

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

Así que en lugar, sólo tiene que utilizar

text = text[:-3] 

(después de reemplazar los espacios en blanco sin nada)

0

¿no es así llevar a cabo las operaciones en el orden equivocado? Usted requisito parece ser foo[:-3].replace(" ", "").upper()

+0

** señala lo siguiente en la pregunta >>> ** (suponiendo que no hay espacios en blanco) –

1

Trato de evitar expresiones regulares, pero esto parece funcionar:

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

+0

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

0

Es cierto lo que depende de su definición de espacios en blanco. En general, llamaría espacios en blanco a espacios, pestañas, saltos de línea y retornos de carro.Si este es su definición desea utilizar una expresión regular con \ s para reemplazar todos los espacios en blanco charactors: Respuesta

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") 
13
>>> foo = "Bs12 3ab" 
>>> foo[:-3] 
'Bs12 ' 
>>> foo[:-3].strip() 
'Bs12' 
>>> foo[:-3].strip().replace(" ","") 
'Bs12' 
>>> foo[:-3].strip().replace(" ","").upper() 
'BS12' 
+0

¿Es necesario reemplazar si la tira ya elimina todos los espacios en blanco? – Lidia

+2

@Lidia Sí, la tira solo elimina el espacio en blanco del principio y el final de la cadena. –

+0

Debe tenerse en cuenta que no puede encadenar esto por ejemplo foo [3:] foo [: - 3] – crafter

Cuestiones relacionadas