mitmario.dev

Textmethoden

Python Sandbox 4 Min Lesezeit 6 BeispieleLektion 1 von 6

Text, der von Menschen kommt, ist selten sauber. In einem Anmeldeformular steht mIA, mit zwei Leerzeichen davor und einem dahinter, die man nicht sieht. Eine Zeile weiter steht SOPHIE MEIER, weil die Feststelltaste noch an war. Für Python sind das ganz andere Texte als Mia und Sophie Meier.

In Lektion 3.1 hast du gesehen, dass "Apfel" und "apfel" verschieden sind. Mit Leerzeichen am Rand ist es genauso, "Mia " == "Mia" ist False. Wenn du so eine Liste vergleichen, sortieren oder ausdrucken willst, musst du sie erst putzen.

Dafür hat Text eine ganze Reihe von Methoden, also Funktionen, die mit einem Punkt an einem Wert aufgerufen werden, wie append bei Listen. Mit sieben davon kommst du im Alltag erstaunlich weit.

Ränder abschneiden

Leerzeichen am Rand
eingabe = "   Mia Schulz  "
print(f"[{eingabe}]")
print(f"[{eingabe.strip()}]")
print(len(eingabe), len(eingabe.strip()))
print(eingabe.strip() == "Mia Schulz")
print("Kaffee,".strip(".,"))

strip() (abstreifen) nimmt allen Leerraum vom Anfang und vom Ende weg. Gemeint sind Leerzeichen, Tabulatoren und Zeilenumbrüche. Was in der Mitte steht, bleibt. Auch das Leerzeichen zwischen Vor- und Nachname, und zwar auch dann, wenn jemand dort zweimal getippt hat. Für diesen Fall gibt es in der nächsten Lektion einen Kniff.

Die eckigen Klammern im Beispiel gehören nicht zum Text. Sie stehen nur da, damit man sieht, wo er anfängt und aufhört, denn Leerzeichen am Ende sieht man sonst überhaupt nicht.

Vorher sind es 15 Zeichen und nachher 10, und erst der geputzte Text ist gleich "Mia Schulz". Soll nur eine Seite weg, gibt es lstrip() für links und rstrip() für rechts. In die Klammern darfst du auch schreiben, welche Zeichen weg sollen. strip(".,") nimmt Punkte und Kommas vom Rand, und so stand es schon im Wörterzähler ganz am Anfang des Kurses.

Groß und klein

Groß und klein
name = "sOPHIE mEIER"
print(name.lower())
print(name.upper())
print(name.title())
print("anna-lena o'connor".title())
print("lisa von bergen".title())
print("Straße".upper())

lower() macht alles klein, upper() alles groß. Klein brauchst du vor allem zum Vergleichen, darum geht es beim Suchen in Text. Groß ist für Dinge gedacht, die man groß schreibt, egal wie jemand sie eingetippt hat. Kennzeichen, Kürzel, eine IBAN.

title() schreibt jedes Wort mit großem Anfangsbuchstaben und den Rest klein. Als Wortanfang zählt dabei alles, was hinter einem Zeichen steht, das kein Buchstabe ist. Deshalb wird aus anna-lena o'connor richtig Anna-Lena O'Connor.

Deutsche Namensregeln kennt title() aber nicht. Aus dem von in lisa von bergen wird Von, und auf einem Briefumschlag wäre das falsch. Für die allermeisten Namen passt title() trotzdem. Man sollte nur wissen, wo es danebenliegt.

Die letzte Zeile ist eine deutsche Besonderheit. "Straße".upper() ergibt STRASSE, denn upper() hält sich an Unicode, die Tabelle aller Schriftzeichen, und dort wird aus ß in Großbuchstaben SS. Der Text wird dabei um ein Zeichen länger.

Ersetzen

Ersetzen
iban = "DE89 3704 0044 0532 0130 00"
print(iban.replace(" ", ""))
zettel = "Milch, Brot, Milch"
print(zettel.replace("Milch", "Hafermilch"))
print(zettel.replace("Milch", "Hafermilch", 1))
print(zettel)

replace(alt, neu) ersetzt einen Teil des Textes durch einen anderen. Wenn jemand eine IBAN mit Leerzeichen abgeschrieben hat, wird daraus so eine ohne, weil jedes Leerzeichen durch einen leeren Text ersetzt und damit gestrichen wird. replace nimmt sich jede Stelle vor, an der der Teil vorkommt, nicht nur die erste. Soll es nur eine sein, gibst du mit einer dritten Zahl an, wie viele.

Die letzte Zeile ist die wichtigste. Nach zwei replace steht in zettel immer noch Milch, Brot, Milch. Warum, steht unter „Der alte Text bleibt“.

Anfang und Ende

Wie fängt es an, wie hört es auf
iban = "DE89370400440532013000"
print(iban.startswith("DE"))
datei = "Rechnung_Oktober.PDF"
print(datei.endswith(".pdf"))
print(datei.lower().endswith(".pdf"))

startswith und endswith fragen, ob ein Text mit etwas anfängt oder aufhört. Die Antwort ist True oder False, also passen beide direkt in ein if. Fängt die IBAN mit DE an, ist es ein deutsches Konto. Hört der Dateiname mit .pdf auf, ist es ein PDF.

Groß und klein zählen dabei mit, und Rechnung_Oktober.PDF hört eben nicht mit .pdf auf. Erst bei datei.lower().endswith(".pdf") kommt ein Ja heraus. Zwei Methoden hintereinander liest man von links nach rechts. Aus datei wird zuerst ein kleingeschriebener Text, und an diesem neuen Text wird dann gefragt.

Der alte Text bleibt

Das Ergebnis geht verloren
name = "  mIA  "
name.strip()
name.title()
print(f"[{name}]")
name = name.strip().title()
print(f"[{name}]")

Auch bei Text gibt es einen Fehler, den fast jeder einmal macht. In der zweiten und dritten Zeile werden strip und title aufgerufen, und trotzdem kommt [ mIA ] heraus. Leerzeichen und Großbuchstaben, genau wie vorher. Die beiden Methoden laufen durchaus, nur wird ihr Ergebnis nirgends aufgehoben. Im Reiter Debug steht name Schritt für Schritt auf ' mIA ' und erst bei der letzten Zeile auf 'Mia'.

Das ist das Gegenstück zu Lektion 5.2. Dort ändern append und remove die Liste selbst und geben None zurück, deshalb steht vor ihnen kein Gleichheitszeichen. Textmethoden ändern den Text nie. Sie geben einen neuen zurück, und der alte bleibt, wie er war. Hier gehört also ein Gleichheitszeichen davor. name = name.strip().title() legt den geputzten Text wieder unter dem alten Namen ab.

Ein Buchstabe lässt sich nicht tauschen
name = "mia"
print(name[0])
name[0] = "M"

Einen Buchstaben kannst du über seine Position lesen, aber nicht ändern. Python meldet dann TypeError: 'str' object does not support item assignment, auf Deutsch etwa „einem einzelnen Zeichen in einem Text kann man nichts zuweisen“. Text ist unveränderlich, wie ein Tupel. Deshalb gibt jede Methode einen neuen Text zurück. Anders ginge es gar nicht.

Was die Aufgabe will

Für ein Vereinsfest haben sich Leute über ein Formular angemeldet, und jeder hat seinen Namen getippt, wie er gerade wollte. Daraus werden Namensschilder, mit dem Namen sauber geschrieben und darunter einer Linie, die genau so lang ist wie der Name. Den geputzten Namen brauchst du dabei zweimal.

Zum Mitnehmen

strip, lower, upper, title und replace geben einen geputzten neuen Text zurück, und mit startswith und endswith fragst du nach Anfang und Ende. Das Original bleibt bei allen unverändert. Was du behalten willst, bekommt einen Namen.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 6 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.