10. String handling#
10.1. (Stringverarbeitung)#
Strings sind neben numerischen Datentypen sicher eines der am häufigsten verwendeten Datenformate, nicht nur in Python. Denken Sie an den Umgang mit Texteingaben, Dateinamen, Kommentaren, Text-basierten Suchen, aber auch Textdateien etc.
Zu Begin der Vorlesung haben wir schon einige String-Operationen kennengelernt:
print("dies" + "das")
print(10 * "?")
Strings zählen in Python zu den Sequenzen, darum können demensprechende Methoden genutzt werden, etwa:
print("das" in "dasselbe") # => True
print("x" not in "abcdefg") # => True
Ebenso das slicing:
print("Ja Nee"[:2]) # => Ja
MINI QUIZ:
Nur zur Wiederholung: Was gibt der folgende Befehl aus?
s = "alles gut"
print(len(s))
a) ValueError
b) 8
c) 9
d) alles gutUnd was der Folgende:
s = "nichts is gut!"
print(s[-7:])
a) is gut!
b) sthcin
c) ValueError
10.2. Escape Character - fix the string#
Manche Zeichen oder Zeichenkombinationen werden von Python besonders interpretiert. Zum einen gibt es einige unmögliche Kombinationen, z.B.
print("Da steht "Stop"!") # => SyntaxError: invalid syntax
In dem konkreten Fall kann es sogar durch die Verwendung verschiedener Anführungszeichen behoben werden:
print('Da steht "Stop"!') # => Da steht "Stop"!
Das kann behoben werden durch die Verwendung vom backslash („“) gefolgt durch das gewünschte Zeichen.
print("Da steht \"Stop\"!") # => Da steht "Stop"!
print("Ein backslash geht darum so: \\")
Letzteres ist übrigens auch der Grund warum Pfade bei Python (zumindest unter Windows) oft mit \\ angegeben werden, also z.B:
path = "C:\\User\\Desktop\\"
filename = path + "testfile.txt"
Auch andere Kombinationen mit „“ lösen bestimmtes Verhalten aus, am häufigsten benutzt davon ist wahrscheinlich „\n“ was einen Zeilenumbruch bedeutet.
print("Damit können endlich endlos lange \n Texte geschrieben werden")
print("Manchmal wird '\\r' oder '\\r\\n' \r\n benutzt",
"statt '\\n' \n doch wir nehmen hier",
"eigentlich immer nur '\\n' \n \n \n",
"wichtig ist dann noch \t tab.")
10.3. String methods#
Darüber hinaus gibt es aber in Python noch eine grosse Zahl von speziellen String-Methoden. Wir werden nicht alle besprechen, aber die in meinen Augen Wichtigsten.
Zur Wiederholung nochmal kurz was Sie machen können wenn Sie die passende Methode nicht mehr parat haben. Das kommt bei Python übrigens auch bei erfahrenen Programmierer*Innen ständig vor!
Eine Möglichkeit ist das Nachschlagen in der Python Dokumentation. Eine andere sehr zugängliche Quelle ist w3schools.com.
Hier eine Tabelle mit den wichtigesten String-Methoden:
10.3.1. String-Methoden in Python#
Methode |
Beschreibung (english) |
|---|---|
count() |
Returns the number of times a specified value occurs in a string |
encode() |
Returns an encoded version of the string |
endswith() |
Returns true if the string ends with the specified value |
index() |
Searches the string for a specified value and returns the position of where it was found |
islower() |
Returns True if all characters in the string are lower case |
isupper() |
Returns True if all characters in the string are upper case |
join() |
Joins the elements of an iterable to the end of the string |
lower() |
Converts a string into lower case |
strip() |
Returns a trimmed version of the string |
lstrip() |
Returns a left trim version of the string |
replace() |
Returns a string where a specified value is replaced with a specified value |
rstrip() |
Returns a right trim version of the string |
split() |
Splits the string at the specified separator, and returns a list |
splitlines() |
Splits the string at line breaks and returns a list |
startswith() |
Returns true if the string starts with the specified value |
strip() |
Returns a trimmed version of the string |
upper() |
Converts a string into upper case |
10.3.2. .replace()#
Recht häufig wollen wir bestimmte Zeichen, Wörter, oder Wortteile ersetzten. Das geht u.a. mit `replace()´.
s = "Nicht immer gefallen uns alle Zeichen"
s.replace("i", "!")
print(s) # => nichts passiert?
Die Methoden ändern nicht den original-String, sondern geben einen neuen zurück:
s_new = s.replace("i", "!")
print(s_new)
Es lassen sich auch mehrere Methodenaufrufe kombinieren:
print(s.replace("i", "!").replace("e", "3"))
Mini Quiz!
Spekulieren Sie: Was gibt der folgende Befehl aus?
print("abc".replace("ab", "cc").replace("c", "x"))
a) ccx
b) ab
c) xxx
d) abx
10.3.3. .upper() und .lower()#
Damit könnte man jetzt auch z.B. zwischen Gross- und Kleinschreibung wechseln, aber dafür gibt es eigene Methoden in Python –> .upper() und .lower()
Zum Beispiel sowas:
tweet = "this is not fair"
tweet_trumpified = tweet.upper() + "!"
print(tweet_trumpified) # => THIS IS NOT FAIR!
Und mit .lower() wieder halbwegs zurück:
tweet_moderated = tweet_trumpified.lower()
print(tweet_moderated)
Oft wollen wir Texte (oder Strings) in eine bestimmte Form bringen damit danach weitere Aktionen oder Analysen funktionieren. Zum Beispiel User-Eingaben vereinheitlichen:
eingabe1 = " Muster, Markus." # Leerzeichen und Punkt stören
eingabe2 = "Test, Trude " # Gleich mehrere Leerzeichen?
.strip() wird genutzt um Leerzeichen (white spaces) an beiden Enden eines Strings zu entfernen. Es gibt auch . rstrip() und .lstrip() die nur auf das rechte oder linke Ende schauen.
print(eingabe1.strip())
print(eingabe2.strip())
.strip() kann noch mehr. Es können nämlich auch weitere Zeichen mit angegeben werden die entfernt werde sollen (und auch mehrere gleichzeitig!)
print(eingabe1.strip("!?. "))
print(eingabe2.strip("!?. "))
10.3.4. Strings (Texte) teilen#
Bei vielen Eingaben, v.a. aber natürlich bei längeren Texte/Strings wollen wir die Strings in kleiner, sinvolle Stückchen teilen.
Dafür gibt es .split() Z.B. bei einer einfachen Eingabe wie:
name = "Muster, Markus"
pieces = name.split(",") # Teilt den String bei jedem ','
print(pieces)
Das gibt eine Liste zurück mit den einzelnen Elementen.
Ein anderes Beispiel:
satz = "Viele Sätze haben viele Worte, manchmal sogar Zeichen!"
worte = satz.split(" ")
print(worte)
print(f"Dieser Satz hat {len(worte)} Worte.")
Wenn wir auch noch die anderen Satzzeichen entfernen möchten, dann kann zusätzlich .replace() gebraucht werden.
satz = "Viele Sätze haben viele Worte, manchmal sogar Zeichen!"
satz_cleaned = satz.replace(",", "").replace("!", "").replace(".", "")
worte = satz_cleaned.split(" ")
print(worte)
print(f"Dieser Satz hat {len(worte)} Worte.")
Oder sowas:
mail = "trude_97@monty-mail.com"
tag, provider = mail.split("@")
print(tag)
print(provider)
10.3.5. String abfragen#
Python kommt mit vielen Möglichkeiten um String-Inhalte abzufragen.
(zusätzlich zu der Sequenzmethode die wir schon gesehen hatten wie: "x" in "xyz")
Typische Beispiele wären .startswith() und .endswith():
s = "name: Markus"
s.startswith("name:") # => True
s.endswith(".") # => False
Hierbei können auch mehrere Abfragen kombiniert werden
if s.startswith(("Name:", "name:", "NAME:")):
print("Ja, ist wohl ein Namenseintrag")
Eine weitere sehr praktische Funktion (die es so ähnlich auch für Listen gibt) ist .count() um die Anzahl eines Elementes zu zählen.
s = "Die meisten Texte haben schon ein paar 'e's."
print(s.count("s")) # => 3
print(s.count("te")) # => 2
print(s.count("Te")) # => 1
Und .index() gibt die Position des ersten Elements zurück
index_te = s.index("te")
print(f"Stelle im String: {index_te}")
print(s[index_te])
10.3.6. Encodings (Zeichen-Kodierungen)#
(wurde schon beim Lesen/Schreiben von Dateien erwähnt, nicht Prüfungsrelevant)
Zeichen (characters) können auf dem Rechner auf verschiedene Arten kodiert werden. Der typische Standard heisst Unicode und die bei weitem am häufigsten Vorkommende Variante ist utf-8. In Python findet sich aber auch noch oft ASCII.
Für den Moment werden wir damit nicht mehr machen.
Aber sollten Sie beim Lesen oder Hantieren eines Strings auf den Error UnicodeDecodeError stossen, dann wissen sie wenigstens unter welchem Schlagwort Sie weitersuchen können.