Abschnitt 6 · Lektion 1
Textmethoden
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
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
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
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
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
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.
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, kostenlosZu 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.