Python Usuń ostatnie 3 znaki łańcucha

146

Próbuję usunąć ostatnie 3 znaki z ciągu w pythonie, nie wiem, jakie to znaki, więc nie mogę ich użyć rstrip, muszę też usunąć wszelkie spacje i przekonwertować je na duże

przykładem może być:

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

To działa i daje mi BS12, czego chcę, jednak jeśli ostatnie 4 i 3 znaki są takie same, tracę oba, np. Jeśli foo = "BS11 1AA"po prostu dostaję'BS'

przykładami foomogą być:

BS1 1AB
bs11ab
BS111ab

Ciąg może mieć 6 lub 7 znaków i muszę porzucić ostatnie 3 (zakładając brak spacji)

Jakieś wskazówki?

Sam Machin
źródło

Odpowiedzi:

278

Usuwanie wszystkich białych znaków:

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

Usuwanie ostatnich trzech znaków:

foo = foo[:-3]

Zamiana na wielkie litery:

foo = foo.upper()

Cały ten kod w jednej linii:

foo = ''.join(foo.split())[:-3].upper()
Noctis Skytower
źródło
9
Chciałbym zauważyć, że ''.join(foo.split())jest to lepsze niż foo.replace(' ', ''), gdy jest używane na łańcuchach Unicode, ponieważ usuwa wszelkie białe znaki, oprócz ' 'znaku (w szczególności, spacje nierozdzielające są również usuwane). To powiedziawszy replace()jest prawdopodobnie znacznie szybsze, więc można go użyć, jeśli, powiedzmy, ciągi wejściowe są zakodowane w ASCII, który ma tylko jeden znak spacji (używam tutaj terminologii Python 2).
Eric O Lebigot
90

Nie działa zgodnie z oczekiwaniami, ponieważ pasek jest oparty na postaci. Zamiast tego musisz to zrobić:

foo = foo.replace(' ', '')[:-3].upper()
Nadia Alramli
źródło
11
To nie usuwa WHITESPACE zgodnie z żądaniem OP; usuwa tylko znaki spacji.
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
źródło
2
@Lidia Tak, strip usuwa tylko białe znaki z początku i końca ciągu.
Eliezer Miron
Należy zauważyć, że nie można tego powiązać, na przykład foo [3:] foo [: - 3]
crafter
9

Mogłeś nieznacznie źle zrozumieć rstrip, usuwa on nie ciąg, ale dowolny znak w określonym ciągu.

Lubię to:

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

Zamiast tego po prostu użyj

text = text[:-3] 

(po zastąpieniu białych znaków niczym)

Mattias Nilsson
źródło
3
>>> foo = 'BS1 1AB'
>>> foo.replace(" ", "").rstrip()[:-3].upper()
'BS1'
SilentGhost
źródło
3

Staram się unikać wyrażeń regularnych, ale wydaje się, że to działa:

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

krs1
źródło
1
string.lower () powinno być string.upper (). Mój błąd.
krs1
jest to jedyne rozwiązanie, które dobrze radzi sobie z białymi
znakami
1

Co w tym złego?

foo.replace(" ", "")[:-3].upper()
otchłań
źródło
1
  1. split
  2. slice
  3. concentrate

To dobry trening dla początkujących i łatwy do osiągnięcia.

Inną zaawansowaną metodą jest taka funkcja:

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

W przypadku tego pytania po prostu chcesz usunąć ostatnie znaki, więc możesz pisać w ten sposób:

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

Myślę, że przestałeś przejmować się tymi trzema postaciami, więc przegrałeś. Chcesz tylko usunąć ostatnie trzy, nieważne kim są!

Jeśli chcesz usunąć określone znaki, możesz dodać kilka, jeśli orzeczenia:

def trim(s):
    if [conditions]:   ### for some cases, I recommend using isinstance().
        return trim(s[slice])
Jaylin
źródło
0

Czy nie wykonujesz operacji w złej kolejności? Wydaje się, że masz takie wymaganiafoo[:-3].replace(" ", "").upper()

AndreaG
źródło
wskazuje na następujące w pytaniu >>> (zakładając brak spacji)
Noctis Skytower
0

To zależy od twojej definicji białych znaków. Ogólnie rzecz biorąc, białe znaki nazwałbym spacjami, tabulatorami, znakami końca wiersza i powrotem karetki. Jeśli to jest twoja definicja, chcesz użyć wyrażenia regularnego z \ s do zastąpienia wszystkich białych znaków:

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
źródło