Vorlesungsskript 10

Ausdrücke für Strings

In diesem Vorlesungsskript lernen wir Operatoren und eingebaute Funktionen kennen, die Strings (Zeichenketten) verarbeiten. Außerdem lernen wir noch drei neue Arten von Ausdrücken kennen und wie wir sie auf Strings anwenden können: Methodenaufrufe, Indexing und Slicing.

Vergleichsoperatoren

Alle Vergleichsoperatoren, die wir für Zahlen kennengelernt haben, lassen sich auch mit Strings benutzen. Im Gegensatz zu Zahlen haben Strings keine „Größe“, aber eine Standard-Sortierreihenfolge (grob gesagt: alphabetisch, aber mit allen Großbuchstaben vor allen Kleinbuchstaben).

Ausdruck Gibt True zurück, wenn…
a == b …die Strings a und b identisch sind.
a != b …die Strings a und b verschieden sind.
a > b …der String a in der Standard-Sortierreihenfolge nach dem String b kommt.
a < b …der String a in der Standard-Sortierreihenfolge vor dem String b kommt.
a >= b …der String a mit dem String b identisch ist oder in der Standard-Sortierreihenfolge danach kommt.
a <= b …der String a mit dem String b identisch ist oder in der Standard-Sortierreihenfolge davor kommt.

Zum Beispiel:

>>> 'dog' == 'DOG'
False
>>> 'dog' == 'dog'
True
>>> 'dog' != 'DOG'
True
>>> 'dog' < 'elephant'
True
>>> 'dog' > 'Elephant'
True

Andere Operatoren

Die Operatoren + und * lassen sich auch mit Strings verwenden: Außerdem unterstützen Strings die Operatoren in und not in:

Ausdruck Gibt zurück
a + b die Strings a und b, zusammengefügt (konkateniert, engl. to concatenate) zu einem einzigen String
n * a oder a * n
der String a, n-mal wiederholt
sub in s
True, wenn der String sub ein Substring des Strings s ist, also wenn er darin vorkommt (sonst False)
sub not in s
True, wenn der String sub kein Substring des Strings s ist, also wenn er nicht darin vorkommt (sonst False)

Zum Beispiel:

>>> a = 'Hänsel'
>>> b = 'Gretel'
>>> a + ' und ' + b
'Hänsel und Gretel'
>>> 5 * 'A'
'AAAAA'
>>> 'the' in 'Athens'
True
>>> 'the' in 'Theater'
False

Funktionen

Hier einige eingebaute Funktionen Pythons, die Sachen mit Strings machen:

Funktionsaufruf Gibt zurück
len(a) Länge des Strings a (die Anzahl der Zeichen, genauer: der Codepoints)
str(a) das Objekt a, aber als String

Zum Beispiel:

>>> len('Hänsel und Gretel')
17
>>> str(2)
'2'
>>> str('abc')
'abc'
>>> str(2.5)
'2.5'
>>> str(False)
'False'
>>> str(None)
'None'
>>> str(['a', 'b'])
"['a', 'b']"
>>> str({'a': 1, 'b': 2})
"{'a': 1, 'b': 2}"

Methodenaufrufe

Methoden sind so etwas Ähnliches wie Funktionen. Der Unterschied ist im Kern, dass eine Methode „zu einem Objekt gehört“. Dieses Objekt nennt man den Empfänger (engl. receiver) der Methode. Wenn wir zum Beispiel zwei Objekte namens p und q haben, und jedes davon hat eine Methode namens m, so sind das trotz des gleichen Namens zwei unterschiedliche Methoden, die auch unterschiedliche Werte zurückgeben können, wenn wir sie aufrufen. Wir können die Methoden unterscheiden, indem wir sie p.m und q.m nennen, also den Empfänger vor den Namen der Methode schreiben, gefolgt von einem Punkt.

Methodenaufrufe beginnen ebenfalls mit dem Empfänger, gefolgt von einem Punkt, dem Namen der Methode und einem Paar runder Klammern, z.B.: p.m() und p.m().

Wie bei Funktionsaufrufen auch können zwischen den runden Klammern bei Methodenaufrufen Argumente stehen.

Welche Methoden ein Objekt hat, hängt vor allem von seinem Typ ab. So haben zum Beispiel Strings viele Methoden, die Zahlen nicht haben, und umgekehrt.

Viele Funktionalitäten, die mit Strings zu tun haben, sind in Python nicht als Funktionen, sondern als Methoden von String-Objekten realisiert. Hier eine Übersicht über einige der wichtigsten:

Methodenaufruf Gibt zurück
s.lower() den String s, in kleinbuchstaben umgewandelt
s.upper() den String s, in GROSSBUCHSTABEN umgewandelt
s.count(sub) wie häufig der String sub in dem String s vorkommt (als int)
s.startswith(sub) True, wenn der String sub am Anfang des Strings s steht (sont False)
s.endswith(sub) True, wenn der String sub am Ende des Strings s steht (sonst False)
s.find(sub) wenn sub ein Substring von s ist: wie viele Zeichen vor dem ersten Vorkommen von sub in s stehen
ansonsten: -1
s.index(sub) wenn sub ein Substring von s ist: wie viele Zeichen vor dem ersten Vorkommen von sub in s stehen
ansonsten tritt ein Fehler auf
s.rfind(sub) wenn sub ein Substring von s ist: wie viele Zeichen vor dem letzten Vorkommen von sub in s stehen
ansonsten: -1
s.format(a, b, …) s muss hier ein Formatstring (engl. format string) sein, der so viele Ersetzungsfelder {} enthält, wie der Methode Argumente übergeben werden; diese werden im zurückgegebenen String durch str(a), str(b) usw. ersetzt
s.isalpha() True, wenn der String s nicht leer ist und ausschließlich Buchstaben enthält (sonst False)
s.isdigit() True, wenn der String s nicht leer ist und ausschließlich Ziffern enthält (sonst False)
s.isspace() True, wenn der String s nicht leer ist und ausschließlich Whitespace-Zeichen enthält (sonst False)
s.lstrip() den String s, aber mit allen Whitespace-Zeichen am Anfang entfernt
s.rstrip() den String s, aber mit allen Whitespace-Zeichen am Ende entfernt
s.strip() den String s, aber mit allen Whitespace-Zeichen am Anfang und am Ende entfernt
s.lstrip(sep) den String s, aber mit allen in dem String sep vorkommenden Zeichen am Anfang entfernt
s.rstrip(sep) den String s, aber mit allen in dem String sep vorkommenden Zeichen am Ende entfernt
s.strip(sep) den String s, aber mit allen in dem String sep vorkommenden Zeichen am Anfang und am Ende entfernt
s.replace(old, new) den String s, aber unter Ersetzung aller Vorkommnisse des Substrings old durch den String new
s.ljust(width) den String s, aber links so mit Leerzeichen aufgefüllt, dass er mindestens width Zeichen lang ist
s.rjust(width) den String s, aber rechts so mit Leerzeichen aufgefüllt, dass er mindestens width Zeichen lang ist
s.center(width) den String s, aber links und rechts gleichmäßig so mit Leerzeichen aufgefüllt, dass er mindestens width Zeichen lang ist

Zum Beispiel:

>>> 'Doghouse'.lower()
'doghouse'
>>> 'Doghouse'.upper()
'DOGHOUSE'
>>> 'Blaukraut bleibt Blaukraut und Brautkleid bleibt Brautkleid'.count('au')
6
>>> 'Blaukraut bleibt Blaukraut und Brautkleid bleibt Brautkleid'.count('ei')
4
>>> 'abc'.startswith('ab')
True
>>> 'abc'.endswith('bc')
True
>>> 'abcabc'.find('bc')
1
>>> 'abcabc'.find('ef')
-1
>>> 'abcabc'.rfind('bc')
4
>>> '{} und {}'.format('Hänsel', 'Gretel')
'Hänsel und Gretel'
>>> 'Hänsel'.isalpha()
True
>>> 'Hänsel und Gretel'.isalpha()
False
>>> '42'.isdigit()
True
>>> '-42'.isdigit()
False
>>> ' \n\t'.isspace()
True
>>> ' \n\ta'.isspace()
False
>>> ' abc de\t\n'.lstrip()
'abc de\t\n'
>>> ' abc de\t\n'.rstrip()
' abc de'
>>> ' abc de\t\n'.strip()
'abc de'
>>> '"Help!"'.strip(',.:!?"')
'Help'
>>> 'Leander und die anderen'.replace('and', 'eis')
'Leeiser und die eiseren'
>>> 'abc'.ljust(7)
'abc    '
>>> 'abc'.rjust(7)
'    abc'
>>> 'abc'.center(7)
'  abc  '

Indexing

Die Zeichen in einem String sind von links nach rechts mit 0, 1, 2 durchnummeriert. Die Nummer eines Zeichens heißt der Index des Zeichens. Da die Zählung mit 0 beginnt, hat das letzte Zeichen in einem String s den Index len(s) - 1.

Um einzelne Zeichen anhand ihrer Position im String zu extrahieren, gibt es eine spezielle Art von Ausdrücken, die Indexing-Ausdrücke: Wenn s ein String ist und i eine Ganzzahl, dann gibt der Indexing-Ausdruck s[i] einen String mit nur einem Zeichen zurück: dem Zeichen mit dem Index i in s. Zum Beispiel:

>>> 'doghouse'[0]
'd'
>>> 'doghouse'[3]
'h'

Negative Indizes sind auch erlaubt, sie zählen Zeichen vom Ende des Strings aus: s[-1] gibt das letzte Zeichen zurück, s[-2] das vorletzte usw. Zum Beispiel:

>>> 'doghouse'[-1]
'e'
>>> 'doghouse'[-5]
'h'

Slicing

Slicing-Ausdrücke können etwas mehr als Indexing-Ausdrücke: sie können nicht nur Substrings der Länge 1, sondern beliebige Substrings anhand ihrer Position extrahieren. Sie haben die Form s[i:j]. s ist hier ein String und i und j sind Indizes, die die linke und die rechte Begrenzung des zu extrahierenden Substrings angeben. Genauer: i ist der Index des ersten Zeichens, das Teil des zu extrahierenden Substrings werden soll. j ist der Index des ersten Zeichens, das nicht mehr zum zu extrahierenden Substring gehören soll. Auch hier sind wieder negative Indizes erlaubt. Zum Beispiel:

>>> 'Waschlotion'[2:8]
'schlot'
>>> 'Waschlotion'[-9:8]
'schlot'
>>> 'Waschlotion'[2:-3]
'schlot'
>>> 'Waschlotion'[-9:-3]
'schlot'

Um einen Substring am Anfang von s zu extrahieren, kann man i auch einfach weglassen. Um einen Substring am Ende von s zu extrahieren, kann man j auch einfach weglassen.

>>> 'doghouse'[0:3]
'dog'
>>> 'doghouse'[:3]
'dog'
>>> 'doghouse'[3:8]
'house'
>>> 'doghouse'[3:]
'house'

Lässt man beide Indizes weg, wird einfach der gleiche String zurückgegeben:

>>> 'doghouse'[:]
'doghouse'

Eine dritte Zahl in Slicing-Ausdrücken, die sogenannte Schrittlänge, sorgt dafür, dass nur jedes n-te Zeichen übernommen wird. Eine negative Schrittlänge kehrt die Reihenfolge der Zeichen um. Zum Beispiel:

>>> 'doghouse'[::2]
'dgos'
>>> 'doghouse'[1::2]
'ohue'
>>> 'doghouse'[::-1]
'esuohgod'