St

Strings in Python

83 Übungen

Über Strings

Ein str ist in Python eine unveränderliche Sequenz aus Unicode-Codepunkten. Dazu gehören unter anderem Buchstaben, diakritische Zeichen, Positionierungszeichen, Ziffern, Währungssymbole, Emojis, Satzzeichen, Leer- und Zeilenumbruchzeichen.

Für einen tieferen Einblick, welche Informationen ein String kodiert (oder, „wie weiß ein Computer, wie er Nullen und Einsen in Buchstaben übersetzt?“), ist dieser Blogbeitrag nach wie vor sehr hilfreich. Die Python-Dokumentation bietet außerdem ein sehr ausführliches Unicode-HOWTO, das Pythons Unterstützung der Unicode-Spezifikation in den Modulen str, bytes und re behandelt, Überlegungen zu Locales sowie einige häufige Probleme mit Kodierung und Übersetzung.

Strings unterstützen alle allgemeinen Sequenzoperationen und lassen sich mit der Syntax for item in <str> oder for index, item in enumerate(<str>) durchlaufen. Einzelne Codepunkte (Strings der Länge 1) lassen sich über einen 0-based index von links oder einen -1-based index von rechts ansprechen.

Strings lassen sich mit <str> + <other str> oder <str>.join(<iterable>) verketten und über <str>.split(<separator>) aufteilen. Außerdem bieten sie zahlreiche zusätzliche Optionen zum Formatieren, Zusammensetzen und Templatisieren.

Ein str-Literal kann mit einzelnen ' oder doppelten " Anführungszeichen deklariert werden. Das Escape-Zeichen \ steht bei Bedarf zur Verfügung.


>>> single_quoted = 'These allow "double quoting" without "escape" characters.'

>>> double_quoted = "These allow embedded 'single quoting', so you don't have to use an 'escape' character."

Mehrzeilige Strings werden mit ''' oder """ deklariert.

>>> triple_quoted = '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
  Line break characters, tabs and other whitespace is fully supported. Remember - The escape "\" character is also available if needed (as can be seen below). 
  
  You\'ll most often encounter multi-line strings as "doc strings" or "doc tests" written just below the first line of a function or class definition.
    They\'re often used with auto documentation ✍ tools.
    '''

Der str(<object>)-Konstruktor kann verwendet werden, um Strings aus anderen Objekten zu erzeugen bzw. umzuwandeln:

>>> my_number = 42
>>> str(my_number)
...
"42"

Der str(<object>)-Konstruktor kann zwar zum Umwandeln in Strings genutzt werden, doch er iteriert nicht über ein Objekt und packt es nicht aus. Das unterscheidet sich vom Verhalten der Konstruktoren anderer Datentypen wie list(), set(), dict() oder tuple() und kann überraschende Ergebnisse liefern.

>>> numbers = [1,3,5,7]
>>> str(numbers)
...
'[1,3,5,7]'

Codepunkte innerhalb eines str lassen sich über einen 0-based index von links ansprechen:

creative = '창의적인'

>>> creative[0]
'창'

>>> creative[2]
'적'

>>> creative[3]
'인'

Die Indexierung funktioniert auch von rechts, beginnend mit einem -1-based index:

creative = '창의적인'

>>> creative[-4]
'창'

>>> creative[-2]
'적'

>>> creative[-1]
'인'

In Python gibt es keinen eigenen Typ für „Zeichen“ oder „Rune“, daher erzeugt die Indexierung eines Strings einen neuen str der Länge 1:


>>> website = "exercism"
>>> type(website[0])
<class 'str'>

>>> len(website[0])
1

>>> website[0] == website[0:1] == 'e'
True

Teilstrings lassen sich über die Slice-Notation auswählen, mit <str>[<start>:<stop>:<step>], um einen neuen String zu erzeugen. Das Ergebnis schließt den stop-Index aus. Wird kein start angegeben, ist der Startindex 0. Wird kein stop angegeben, ist der stop-Index das Ende des Strings.

moon_and_stars = '🌟🌟🌙🌟🌟⭐'

>>> moon_and_stars[1:4]
'🌟🌙🌟'

>>> moon_and_stars[:3]
'🌟🌟🌙'

>>> moon_and_stars[3:]
'🌟🌟⭐'

>>> moon_and_stars[:-1]
'🌟🌟🌙🌟🌟'

>>> moon_and_stars[:-3]
'🌟🌟🌙'

Strings lassen sich außerdem über <str>.split(<separator>) in kleinere Strings zerlegen, was eine list von Teilstrings zurückgibt. Wird <str>.split() ohne Argumente verwendet, wird der String an Whitespace aufgeteilt.

>>> cat_ipsum = "Destroy house in 5 seconds command the hooman."
>>> cat_ipsum.split()
...
['Destroy', 'house', 'in', '5', 'seconds', 'command', 'the', 'hooman.']


>>> cat_words = "feline, four-footed, ferocious, furry"
>>> cat_words.split(',')
...
['feline', ' four-footed', ' ferocious', ' furry']


>>> colors = """red,
orange,
green,
purple,
yellow"""

>>> colors.split(',\n')
['red', 'orange', 'green', 'purple', 'yellow']

Strings lassen sich mit dem Operator + verketten. Diese Methode sollte sparsam eingesetzt werden, da sie nicht sehr performant und schwer zu pflegen ist.

language = "Ukrainian"
number = "nine"
word = "дев'ять"

sentence = word + " " + "means" + " " + number + " in " + language + "."

>>> print(sentence)
...
"дев'ять means nine in Ukrainian."

Wenn eine list, tuple, set oder eine andere Sammlung einzelner Strings zu einem einzigen str zusammengefügt werden soll, ist <str>.join(<iterable>) die bessere Wahl:

# str.join() makes a new string from the iterables elements.
>>> chickens = ["hen", "egg", "rooster"] # Lists are iterable.
>>> ' '.join(chickens)
'hen egg rooster'

# Any string can be used as the joining element.
>>> ' :: '.join(chickens)
'hen :: egg :: rooster'

>>> ' 🌿 '.join(chickens)
'hen 🌿 egg 🌿 rooster'


# Any iterable can be used as input.
>>> flowers = ("rose", "daisy", "carnation")  # Tuples are iterable.
>>> '*-*'.join(flowers)
'rose*-*daisy*-*carnation'

>>> flowers = {"rose", "daisy", "carnation"}  # Sets are iterable, but output order is not guaranteed.
>>> '*-*'.join(flowers)
'rose*-*carnation*-*daisy'

>>> phrase = "This is my string"  # Strings are iterable, but be careful!
>>> '..'.join(phrase)
'T..h..i..s.. ..i..s.. ..m..y.. ..s..t..r..i..n..g'


# Separators are inserted **between** elements, but can be any string (including spaces).
# This can be exploited for interesting effects.
>>> under_words = ['under', 'current', 'sea', 'pin', 'dog', 'lay']
>>> separator = ' ⤴️ under' # Note the leading space, but no trailing space.
>>> separator.join(under_words)
'under ⤴️ undercurrent ⤴️ undersea ⤴️ underpin ⤴️ underdog ⤴️ underlay'

# The separator can be composed different ways, as long as the result is a string.
>>> upper_words = ['upper', 'crust', 'case', 'classmen', 'most', 'cut']
>>> separator = ' 🌟 ' + upper_words[0] # This becomes one string, similar to ' ⤴️ under'.
>>> separator.join(upper_words)
 'upper 🌟 uppercrust 🌟 uppercase 🌟 upperclassmen 🌟 uppermost 🌟 uppercut'

Strings unterstützen alle allgemeinen Sequenzoperationen. Einzelne Codepunkte lassen sich in einer Schleife mit for item in <str> durchlaufen. Indizes mit ihren Elementen lassen sich in einer Schleife mit for index, item in enumerate(<str>) durchlaufen.


>>> exercise = 'လေ့ကျင့်'

# Note that there are more code points than perceived glyphs or characters.
# Care should be used when iterating over languages that use
# combining characters, or when dealing with emoji.
>>> for code_point in exercise:
...    print(code_point)
...
လ
ေ
့
က
ျ
င
်
့

# Using enumerate will give both the value and index position of each element.
>>> for index, code_point in enumerate(exercise):
...    print(index, ": ", code_point)
...
0 :  လ
1 :  ေ
2 :  ့
3 :  က
4 :  ျ
5 :  င
6 :  ်
7 :  ့

String-Methoden

Python bietet eine umfangreiche Sammlung von String-Methoden, die beim Suchen, Bereinigen, Aufteilen, Umwandeln, Übersetzen und bei vielen weiteren Operationen helfen. Eine Auswahl dieser Methoden wird in einer anderen Übung behandelt.

Formatierung

Python bietet außerdem eine umfangreiche Sammlung von Tools zum Formatieren und Templatisieren von Strings sowie eine ausgefeiltere Textverarbeitung durch die Module re (reguläre Ausdrücke), difflib (Sequenzvergleich) und textwrap. Eine großartige Einführung in die String-Formatierung in Python findest du in diesem Beitrag bei Real Python. Eine Einführung in String-Methoden findest du auf derselben Seite unter Strings and Character Data in Python.

Verwandte Typen und Kodierungen

Neben str (einer Text-Sequenz) hat Python entsprechende binäre Sequenztypen, die unter binäre Datendienste zusammengefasst sind – bytes (eine binäre Sequenz), bytearray und memoryview für die effiziente Speicherung und Verarbeitung binärer Daten. Darüber hinaus ermöglichen Streams das Senden und Empfangen binärer Daten über eine Netzwerkverbindung ohne Verwendung von Callbacks.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Strings

Das Üben ist gesperrt

Schalte 4 weitere Übungen frei, um Strings zu üben