Zum Inhalt

Arbeiten mit Zeichenketten

Ein weiterer wichtiger Datentyp in Programmiersprachen ist die Zeichenkette aka String. Strings sind eine zusammengesetzte Datenstruktur, welche aus einer geordneten Sequenz einzelner Zeichen besteht. Ein Einzelzeichen wird als Char oder Character bezeichnet. Für Strings sind viele hilfreiche Funktion bzw. Methoden definiert, welche es zum Beispiel ermöglichen Teilstrings auszuschneiden, Leerräume am Beginn oder Ende zu entfernen oder den String in Groß- oder Kleinbuchstaben zu überführen.

String Literal

Zur Initialisierung eines String wird ein String Literal angegeben. Dazu werden einfache oder doppelte Anführungszeichen verwendet:

a = "eine zeichenkette"
b = 'eine andere zeichenkette'

Ein String ist immer einzeilig definiert. Es gibt die Möglichkeit zur Angabe von 3 Anführungszeichen ''' oder """ für die Definition von mehrzeiligen Strings:

a = """mehrzeilige
zeichen-
kette
"""

b = '''mehrzeilige
zeichen-
kette
'''

Anführungszeichen

Es gibt generell keine Präferenz ob mit einfachen oder doppelten Anführungszeichen gearbeitet wird. Es müssen nur die selben Anführungszeichen am Anfang und am Ende einer Zeichenkette verwendet werden.

Eine Zeichenkette besitzt eine dedizierte Länge, jenachdem aus wievielen Zeichen diese besteht. Mit der Build-in Funktion len kann die Länge der Zeichenkette abgefragt werden:

a = "eine 34 Zeichen lange Zeichenkette"
len(a)  # 34

String Escaping

Für Strings in Python ist der Backslash \ als Escape-Zeichen definiert. Mit diesem Zeichen wird kein Text repräsentiert, sondern dem nachfolgenden Zeichen eine besondere Bedeutung zugeordnet.

Als einfaches Beispiel kann durch das Escape-Zeichen in einem String ein ' oder " eingebettet werden, obwohl das String Literal mit diesem Zeichen definiert wird. Im Beispiel 'Joe\'s Pub' verliert das Zeichen ' die Funktion des Stringabschlusses und wird als normales Zeichen im String verwendet:

name = 'Joe\'s Pub'

Ein weiteres gängiges Sonderzeichen wäre der Zeilenumbruch, welcher mit \n angegeben werden kann.

Angabe des Backslash

Durch das Escaping kommt dem Backslash eine besondere Bedeutung in Strings zu. Wenn man den Backslash als einfaches Zeichen in einem String nutzen will, muss dieser selbst escaped werden. Dies geschieht einfach durch eine Verdopplung: \\

Verständnisfrage

Überlegen Sie wie man die folgende Tabelle mit einem einzeiligen String und Escape-Zeichen erzeugen könnte:

+-----+-----------+------------+
| Nr. | Name      | Geburtstag |
+-----+-----------+------------+
| 1   | Hansi     | 12.10.1989 |
+-----+-----------+------------+
| 2   | Katharina | 03.06.1975 |
+-----+-----------+------------+
| 2   | Freddie   | 29.02.1981 |
+-----+-----------+------------+

Operationen mit Zeichenkette

Ähnlich zu Zahlen sind auch für Strings Operationen definiert. Da mit Strings nicht gerechnet werden kann, gibt es grundsätzlich nur 2 sinnvolle Operationen für Strings.

Konkatenation

Mit der Konkatenation oder Zusammenführung können mindestens 2 Strings zu einem längeren String zusammengeführt werden. Als Operator wird in Python das + Symbol verwendet.

Im folgenden werden die beiden Strings in den Variablen a und b zu einem längeren String in der Variable c konkateniert:

a = "erster teil"
b = "zweiter teil"
c = a + " --- " + b
print(c)  # erster teil --- zweiter teil

Vervielfachung

Durch eine Multiplikation mit einer Ganzahl kann ein String vervielfältigt werden:

x = " :-) " * 3
print(x)  #  :-)  :-)  :-) 

Indexierter Zugriff

Ein String besteht aus einer geordneten Menge (Sequenz) von Einzelzeichen. Dabei kann jedes Zeichen des Strings über einen Index referenziert werden. Für die Referenzierung kann ein positivier Index (von links mit 0 beginnend) oder ein negativer Index (von rechts mit -1 beginnend) gewählt werden.

Der String ein string hätte eine Länge von 10. Somit könnte das erste Zeichen mit 0 oder mit -10 und das letzte Zeichen mit 9 oder -1 referenziert werden.

e
i
n
s
t
r
i
n
g
positiver
Index
0
1
2
3
4
5
6
7
8
9
negativer
Index
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1

In Python kann eine Position im String mit eckigen Klammern und dem Index als Ganzzahl angesprochen werden. Im folgenden Beispiel wird der String ein string in der Variable ex definiert. Als Beispiel kann das erste Zeichen e mit ex[0] und das letzte Zeichen g mit ex[-1] abgefragt werden:

ex = "ein string"
print(ex[0])   # e
print(ex[-1])  # g

Teilstrings mit Slicing

In Python ist für den Datentyp String das sog. Slicing definiert. Durch die Angabe eines Startindex und eines Endindex kann ein Teilbereich eines Strings ausgeschnitten werden. Syntaktisch werden die Indizes mit : getrennt in eckigen Klammern angegeben. Ähnlich zum Zugriff auf einen einzelnen Index können auch negative Indexangaben gemacht werden.

Im Beispiel wird im String "Am Abend gehe ich gerne Laufen" der Teilstring "Abend" über den Startindex 3 und den Endindex 8 ausgeschnitten.

a = "Am Abend gehe ich gerne Laufen"
print(a[3:8])  # Abend

Wenn man das Beispiel etwas genauer unter die Lupe nimmt, wird ersichtlich, dass beim Slicing der Startindex inklusive und der Endindex exklusive ist. Konkret ist also der Startindex im Teilstring als erstes Zeichen enthalten, der Endindex jedoch nicht mehr:

012345678901234567890123456789
Am Abend gehe ich gerne Laufen
   ^    ^

Verständnisfrage

Versuchen Sie andere Wörter aus dem String "Am Abend gehe ich gerne Laufen" über Slicing auszuschneiden. Nutzen Sie dazu auch negative Indexangaben. Überprüfen Sie Ihre Experiment mit einem Python Interpreter.

Implizite Indexangabe

Als syntactic Sugar ist es möglich im Slicing die Indexangabe auszusparen. Implizit wird für den Startindex 0 und für den Endindex die Länge des Strings angenommen.

a = "Am Abend gehe ich gerne Laufen"
print(a[:])    # Am Abend gehe ich gerne Laufen
print(a[:3])   # Am
print(a[24:])  # Laufen

Negative Indexangabe

Es ist auch möglich im Slicing einen negativen Wert für den Start- bzw. Endindex anzugeben. Als Beispiel könnte man sich die Extension eines Dateinahmens aus einem String ausschneiden (sofern dieser die Länge 3 hat):

ex1 = "Urlaubsbild.jpg"
ex2 = "Ein_anderes_Urlaubsbild.png"

print(ex1[-3:])  # jpg
print(ex2[-3:])  # png

Schrittweite

Für das Slicing kann eine Schrittweite angegeben werden. Damit könnte zum Beispiel bewerkstelligt werden, dass nur jedes zweite Zeichen in den Teilstring integriert wird. Die Schrittweite wird durch einen weiteren : innerhalb der eckigen Klammern angegeben.

a = "Am Abend gehe ich gerne Laufen"
a[3:8:2]  # Aed

Die Schrittweite kann auch einen negativen Wert erhalten, somit wird im Slicing der Teilstring von hinten nach vorne aus dem original String ausgeschnitten. Bei einer negativen Schrittweite ist darauf zu achten, dass die Schritte vom Startindex zum Endindex auch in umgekehrter Reihenfolge durchgeführt werden:

a = "Am Abend gehe ich gerne Laufen"
a[7:2:-1]  # dnebA

Verständnisfrage

Überlegen Sie sich, welcher Startindex bzw. Endindex festgelegt werden muss um den Originalstring komplett umzudrehen. Also wie kann durch Slicing der String "Am Abend gehe ich gerne Laufen" in den String "nefuaL enreg hci eheg dnebA mA" überführt werden?

Typkonvertierungen

Im Abschnitt Arbeiten mit Zahlen wurden die Datentypen int und float eingeführt. Eine Zahl kann immer in einen String überführt werden. Ein String kann nur unter gewissen Umständen in eine Zahl umgewandelt werden. Die Umwandlung eines Wertes von einem Datentyp in einen anderen Datentyp nennt man Typkonvertierung.

Für die Typkonvertierung in einen String gibt es die Built-in Funktion str. Im Beispiel wird die Zahl 10 in einen String konvertiert:

a = str(10)
print(type(a))  # <class 'str'>

Strings können über die Funktionen int oder float in eine Ganzzahl oder Kommazahl überführt werden. Am Beispiel der Funktion int ist eine Konvertierung nur möglich wenn sich eine Ganzzahl im String enthält. Die Funktion int würde einen ValueError erzeugen, wenn die Konvertierung fehlschlägt. Im folgenden Beispiel wird erfolgreich versucht den String "123456" in eine Ganzzahl zu überführen:

a = int("123456")
print(type(a))  # <class 'int'>

In einem anderen Beispiel wird versucht den String "abcd" in eine Ganzzahl zu konvertieren:

b = int("abcd")

Der String "abcd" lässt sich jedoch nicht in eine Ganzahl konvertieren und führt daher zu folgendem Fehler:

ValueError: invalid literal for int() with base 10: 'abcd'

Mit der Funktion float kann ein String in eine Kommazahl überführt werden. So kann zum Beispiel der String "12.35434" in eine Kommazahl überführt werden:

a = float("12.35434")
print(type(a))  # <class 'float'>

Kommandozeilen Ein- und Ausgabe

Die ersten Programme werden vorrangig für die Kommandozeile geschrieben werden. Eine Kommandozeile ist eine Textbasierte Benutzerschnittstelle für einen Computer, aus diesem Grund sind String für die Erstellung von Kommandozeilenprogrammen essentiell. Für die Gestaltung der Benutzereingabe bzw. -ausgabe können die Python Funktionen input und print verwendet werden.

Mit print kann eine beliebige Zeichenkette auf der Kommandozeile ausgegeben werden:

print('Hello world')

Mit der Funktion input wird eine Eingabe über die Kommandozeile von Benutzer:innen abgefragt. Die Eingabe ist in diesem Fall vom Datentyp str. Mit dem Drücken der Enter-Taste wird die Eingabe auf der Kommandozeile abgeschlossen.

name = input('Gib deinen Namen ein:')

Formatierte Ausgabe

Innerhalb einer Zeichenkette können Platzhalter {} definiert werden, welche durch die Funktion format mit beliebigen Werten gefüllt werden können.

template = "Name: {}, Alter: {}"
print(template.format("Peter", 42))  # Name: Peter, Alter: 42

Die Reihenfolge der Platzhalter {} korrespondiert mit der Reihenfolge wie die Parameter an die Funktion format übergeben werden.

Neben dem reinen Ersetzen können auch komplexere Formatierungen durchgeführt werden. Python hat dazu eine kleine "Mini-Sprache" integriert. Eine detailierte Beschreibung dieser Mini-Sprache findet sich in der Python Dokumentation.

res = "Kosten: € {:> 8.2f}".format(159.9868)
print(res)  # Kosten: €   159.99