strip() aufhört normal zu funktionieren wegen "\n"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kolaha
User
Beiträge: 2
Registriert: Dienstag 8. Oktober 2024, 21:17

Hallo.
Habe was seltsames gefunden, als ich testete:

Code: Alles auswählen

txt = ",,,,,rrttgg.....banana....rrr"
x = txt.strip(",.grt")
print(x)
die Ausgabe ist:

Code: Alles auswählen

banana
wie man erwartet, aber wenn ich ein Symbol hinzufüge:

Code: Alles auswählen

txt = ",,,,,rrttgg.....banana....rrr\n"
x = txt.strip(",.grt")
print(x)
die Ausgabe sieht dann so aus:

Code: Alles auswählen

banana....rrr
Ist es ein Bug oder soll es so sein?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1224
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Funktioniert wie erwartungsgemäß. Diese Frage kommt ziemlich oft auf. Die Methode strip entfernt vom str alle Zeichen (links und rechts), die angegeben werden, bis ein Zeichen erreicht wird, das nicht in der Menge enthalten ist. Ich sage mit Absicht Menge, da die zu entfernenden Zeichen keine vorgesehene Reihenfolge haben.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

Dabei gehört das "\n" mit zur Zeichenkette und die Prüfung rechts fängt genau damit an.
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich frage mich sowieso, wofür man strip() mit mehr als einem Zeichen verwendet. Die Ausnahme ist Whitespace, aber das ist ja sowieso die Standardeinstellung, wenn man kein Argument übergibt. Interessant dass dieses Verhalten anscheinend auch bei der Übergabe von anderen Zeichen erwartet wird. Also dass strip() demnach immer Whitespace von den Rändern entfernen würde und dann noch weitere Zeichen in Betracht zieht. Okay, könnte man so implementieren, ist aber halt nicht der Fall.

Das gewünschte Verhalten würde man so bekommen:

Code: Alles auswählen

txt.strip().strip(",.grt")
Ein strip() mit "Whitespace-Schalter" könnte so aussehen:

Code: Alles auswählen

def strip(string, chars=None, drop_whitespace=True):
    if drop_whitespace:
        string = string.strip()
    if chars is not None:
        return string.strip(chars)
    return string
Wobei ich diese Funktion nicht wirklich schreiben würde, sondern dann auf das oben gezeigte doppelte strip() zurückgreifen würde, auch wenn es nicht ganz so elegant aussieht.
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Das ist halt nützlich wenn man mehr als ein Zeichen entfernen möchte. Whitespace ist ein häufiger Fall, aber es gibt auch andere Zeichenmengen die in bestimmten Syntaxen (?) so etwas wie Füllzeichen sind, die man entfernen möchte. Und da ist das praktisch. Sonst würde man wohl zu regulären Ausdrücken in diesen Fällen greifen.

Warum es so eine Methode gibt könnte vielleicht auch die Existenz der POSIX-C-Funktion `strspn()` sein.

``txt.strip().strip(",.grt")`` ist doch im Grunde nur etwas was man schreibt weil man zu faul ist sich Code zu schreiben, der die ”whitespace” Unicode-Zeichen in eine Konstante packt, damit man mit *einem* `strip()`-Aufruf auskommt. 😉
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
nezzcarth
User
Beiträge: 1750
Registriert: Samstag 16. April 2011, 12:47

snafu hat geschrieben: Mittwoch 9. Oktober 2024, 18:43 Ich frage mich sowieso, wofür man strip() mit mehr als einem Zeichen verwendet.
Als ich mit Python anfing, habe ich erst angenommen, das Argument von strip() würde so wie es ist als ganzes Präfixe/Suffixe entfernt. Und wenn man nur den Fall prüft, scheint es das ja auch zu passieren, aber halt nicht nur. Dass man eine Menge als String übergibt, erscheint mir jedenfalls nach wir vor etwas kontraintuitiv, aber na ja :)
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@nezzcarth:
Für den Fall gibt es ja mittlerweile removesuffix() und removeprefix(), die genau dafür gedacht sind.

Vor diesen beiden hätte man das mittels partition() lösen können oder natürlich, indem man die Funktionalität mit der index()-Methode und Slicing nachbaut.

Code: Alles auswählen

text = "foobarXXY"

print(text.strip("XY"))
print(text.removesuffix("XY"))

# Nachgebaute Variante
print(text[:text.index("XY")])
Der Ansatz mit index() wirft übrigens einen ValueError, falls das Suffix nicht enthalten ist, während bei removesuffix() und auch bei strip() stillschweigend bloß der ursprüngliche String zurückgeliefert wird. Dieses unterschiedliche Verhalten kann ja sogar gewünscht sein, je nach Situation.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Die index-Methode würde den String irgendwo finden und nicht nur am Ende.

Code: Alles auswählen

text = "fooXYbarXXY"
print(text.strip("XY"))
print(text.removesuffix("XY"))
print(text[:text.index("XY")])
print(text[:-len("XY")] if text.endswith("XY") else text)
Kolaha
User
Beiträge: 2
Registriert: Dienstag 8. Oktober 2024, 21:17

Vielen Dank für Aufklärung.
Antworten