Python Remove os últimos 3 caracteres de uma string

146

Estou tentando remover os três últimos caracteres de uma string em python, não sei quais são esses caracteres, então não posso usar rstrip, também preciso remover qualquer espaço em branco e converter em maiúsculas

um exemplo seria:

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

Isso funciona e me dá BS12, que é o que eu quero, no entanto, se os últimos 4º e 3º caracteres forem os mesmos, eu perco os dois, por exemplo, se foo = "BS11 1AA"eu conseguir'BS'

exemplos de foopoderiam ser:

BS1 1AB
bs11ab
BS111ab

A sequência pode ter 6 ou 7 caracteres e preciso eliminar os 3 últimos (assumindo que não há espaço em branco)

Alguma dica?

Sam Machin
fonte

Respostas:

278

Removendo todo e qualquer espaço em branco:

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

Removendo os últimos três caracteres:

foo = foo[:-3]

Convertendo em letras maiúsculas:

foo = foo.upper()

Todo esse código em uma linha:

foo = ''.join(foo.split())[:-3].upper()
Noctis Skytower
fonte
9
Gostaria de observar que ''.join(foo.split())é melhor do que foo.replace(' ', ''), quando usado em seqüências de caracteres unicode porque remove qualquer caractere de espaço em branco , além do ' 'caractere (em particular, os espaços não quebráveis ​​também são removidos). Dito isto, replace()provavelmente é muito mais rápido, portanto pode ser usado se, digamos, as seqüências de entrada forem codificadas em ASCII, que possui apenas um caractere de espaço (estou usando a terminologia Python 2, aqui.)
Eric O Lebigot
90

Não funciona como o esperado, porque a tira é baseada em caracteres. Você precisa fazer isso:

foo = foo.replace(' ', '')[:-3].upper()
Nadia Alramli
fonte
11
Isso não remove o WHITESPACE conforme solicitado pelo OP; remove apenas caracteres ESPAÇO.
John Machin
15
>>> foo = "Bs12 3ab"
>>> foo[:-3]
'Bs12 '
>>> foo[:-3].strip()
'Bs12'
>>> foo[:-3].strip().replace(" ","")
'Bs12'
>>> foo[:-3].strip().replace(" ","").upper()
'BS12'
ghostdog74
fonte
2
@Lidia Sim, a tira remove apenas os espaços em branco do início e do fim da string.
Eliezer Miron
Deve-se observar que você não pode encadear isso, por exemplo foo [3:] foo [: - 3] #
crafter
9

Você pode ter entendido um pouco rstrip um pouco, pois ele não retira uma string, mas qualquer caractere que você especificar.

Como isso:

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

Então, basta usar

text = text[:-3] 

(depois de substituir o espaço em branco por nada)

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

Eu tento evitar expressões regulares, mas isso parece funcionar:

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

krs1
fonte
1
string.lower () deve ser string.upper (). Meu erro.
krs1
esta é a única solução que endereços whiteSpace bem
Erik Aronesty
1

O que há de errado nisso?

foo.replace(" ", "")[:-3].upper()
abyx
fonte
1
  1. split
  2. slice
  3. concentrate

Este é um bom treino para iniciantes e é fácil de conseguir.

Outro método avançado é uma função como esta:

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

E para esta pergunta, você apenas deseja remover os últimos caracteres, para poder escrever assim:

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

Eu acho que você acabou de se preocupar com o que esses três personagens são, então você perdeu. Você só quer remover os três últimos, no entanto, quem são eles!

Se você deseja remover alguns caracteres específicos, pode adicionar alguns julgamentos se:

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

Você não está executando as operações na ordem errada? Você exigência parece serfoo[:-3].replace(" ", "").upper()

AndreaG
fonte
Os pontos no seguinte na pergunta >>> (assumindo que o espaço não é branca)
Noctis Skytower
0

É um pouco do que depende da sua definição de espaço em branco. Eu geralmente chamaria espaço em branco como espaços, tabulações, quebras de linha e retornos de carro. Se esta for sua definição, você deseja usar um regex com \ s para substituir todos os caracteres de espaço em branco:

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")
Lee Joramo
fonte