Python Entfernen Sie die letzten 3 Zeichen einer Zeichenfolge

146

Ich versuche, die letzten 3 Zeichen aus einer Zeichenfolge in Python zu entfernen. Ich weiß nicht, was diese Zeichen sind, daher kann ich sie nicht verwenden rstrip. Außerdem muss ich Leerzeichen entfernen und in Großbuchstaben konvertieren

Ein Beispiel wäre:

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

Dies funktioniert und gibt mir BS12, was ich will, aber wenn die letzten 4. und 3. Zeichen gleich sind, verliere ich beide, zB wenn foo = "BS11 1AA" ich nur bekomme'BS'

Beispiele für fookönnten sein:

BS1 1AB
bs11ab
BS111ab

Die Zeichenfolge kann aus 6 oder 7 Zeichen bestehen und ich muss die letzten 3 Zeichen löschen (unter der Annahme, dass kein Leerzeichen vorhanden ist).

Irgendwelche Tipps?

Sam Machin
quelle

Antworten:

278

Entfernen aller Leerzeichen:

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

Die letzten drei Zeichen entfernen:

foo = foo[:-3]

Umrechnung in Großbuchstaben:

foo = foo.upper()

Der ganze Code in einer Zeile:

foo = ''.join(foo.split())[:-3].upper()
Noctis Skytower
quelle
9
Ich möchte darauf hinweisen, dass dies ''.join(foo.split())besser ist als foo.replace(' ', '')bei Verwendung in Unicode-Zeichenfolgen, da zusätzlich zum Zeichen auch Leerzeichen entfernt werden ' '(insbesondere werden auch nicht unterbrechende Leerzeichen entfernt). Das heißt, es replace()ist wahrscheinlich viel schneller, so dass es verwendet werden kann, wenn beispielsweise bekannt ist, dass die Eingabezeichenfolgen in ASCII codiert sind, das nur ein Leerzeichen enthält (ich verwende hier die Python 2-Terminologie)
Eric O Lebigot
90

Es funktioniert nicht wie erwartet, da Strip zeichenbasiert ist. Sie müssen dies stattdessen tun:

foo = foo.replace(' ', '')[:-3].upper()
Nadia Alramli
quelle
11
Dadurch wird WHITESPACE nicht entfernt, wie vom OP angefordert. Es werden nur Leerzeichen entfernt.
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
quelle
2
@Lidia Ja, Strip entfernt nur Leerzeichen vom Anfang und Ende der Zeichenfolge.
Elieser Miron
Es sollte beachtet werden, dass Sie dies nicht
verketten
9

Möglicherweise haben Sie rstrip leicht missverstanden. Es entfernt keine Zeichenfolge, sondern ein beliebiges Zeichen in der von Ihnen angegebenen Zeichenfolge.

So was:

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

Also stattdessen einfach verwenden

text = text[:-3] 

(nach dem Ersetzen von Leerzeichen durch nichts)

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

Ich versuche, reguläre Ausdrücke zu vermeiden, aber das scheint zu funktionieren:

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

krs1
quelle
1
string.lower () sollte string.upper () sein. Mein Fehler.
krs1
Dies ist die einzige Lösung, die Whitespace gut anspricht
Erik Aronesty
1

Was ist daran falsch?

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

Dies ist ein gutes Training für Anfänger und es ist leicht zu erreichen.

Eine andere fortgeschrittene Methode ist eine Funktion wie diese:

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

Und für diese Frage möchten Sie nur die letzten Zeichen entfernen, damit Sie wie folgt schreiben können:

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

Ich denke, Sie müssen sich darum kümmern, was diese drei Charaktere sind, also haben Sie verloren. Sie wollen nur die letzten drei entfernen, trotzdem wer sie sind!

Wenn Sie bestimmte Zeichen entfernen möchten, können Sie einige if-Urteile hinzufügen:

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

Führen Sie die Operationen nicht in der falschen Reihenfolge aus? Ihre Anforderung scheint zu seinfoo[:-3].replace(" ", "").upper()

AndreaG
quelle
Punkte auf das Folgende in der Frage >>> (unter der Annahme, dass kein Leerraum vorhanden ist)
Noctis Skytower
0

Es hängt etwas von Ihrer Definition von Leerzeichen ab. Ich würde Whitespace im Allgemeinen als Leerzeichen, Tabulatoren, Zeilenumbrüche und Zeilenumbrüche bezeichnen. Wenn dies Ihre Definition ist, möchten Sie einen regulären Ausdruck mit \ s verwenden, um alle Leerzeichen zu ersetzen:

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
quelle