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 stehenansonsten: -1
|
s.index(sub) |
wenn sub ein Substring von s ist: wie viele Zeichen vor dem ersten Vorkommen von sub in s stehenansonsten 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 stehenansonsten: -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'