Grundlagen der Textverarbeitung

PythonPythonIntermediate
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Abschnitt werden Methoden zur Arbeit mit Text vorgestellt.

Dies ist ein Guided Lab, das schrittweise Anweisungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Labor der Stufe Fortgeschrittener mit einer Abschlussquote von 74% ist. Es hat eine positive Bewertungsrate von 86% von den Lernenden erhalten.

Darstellung von Literaltext

String-Literale werden in Programmen mit Anführungszeichen geschrieben.

## Einzelnes Anführungszeichen
a = 'Yeah but no but yeah but...'

## Doppeltes Anführungszeichen
b = "computer says no"

## Dreifache Anführungszeichen
c = '''
Look into my eyes, look into my eyes, the eyes, the eyes, the eyes,
not around the eyes,
don't look around the eyes,
look into my eyes, you're under.
'''

Normalerweise können Strings nur eine einzelne Zeile umfassen. Mit dreifachen Anführungszeichen werden alle im Rahmen mehrerer Zeilen eingeschlossenen Texte inklusive der gesamten Formatierung erfasst.

Es besteht kein Unterschied zwischen der Verwendung von einfachen (') und doppelten (") Anführungszeichen. Allerdings muss das gleiche Anführungszeichentyp verwendet werden, um eine Zeichenkette zu beginnen und zu beenden.

String-Umgebungszeichen

Umgebungszeichen werden verwendet, um Steuerzeichen und Zeichen darzustellen, die nicht einfach direkt am Tastatur eingegeben werden können. Hier sind einige häufige Umgebungszeichen:

'\n'      Zeilenumbruch
'\r'      Wagenrücklauf
'\t'      Tabulator
'\''      Literales einfaches Anführungszeichen
'\"'      Literales doppeltes Anführungszeichen
'\\'      Literales Backslash

String-Darstellung

Jedes Zeichen in einer Zeichenkette wird intern als sogenannter Unicode-"Codepunkt" gespeichert, der eine Ganzzahl ist. Sie können einen genauen Codepunkt-Wert mithilfe der folgenden Escape-Sequenzen angeben:

a = '\xf1'          ## a = 'ñ'
b = '\u2200'        ## b = '∀'
c = '\U0001D122'    ## c = '𝄢'
d = '\N{FOR ALL}'   ## d = '∀'

Die Unicode-Charakterdatenbank ist eine Referenz für alle verfügbaren Zeichensymbole.

String-Indexierung

Strings funktionieren wie ein Array für den Zugriff auf einzelne Zeichen. Sie verwenden einen ganzzahligen Index, der bei 0 beginnt. Negative Indizes geben eine Position relativ zum Ende der Zeichenkette an.

a = 'Hello world'
b = a[0]          ## 'H'
c = a[4]          ## 'o'
d = a[-1]         ## 'd' (Ende der Zeichenkette)

Sie können auch Teile oder Substrings auswählen, indem Sie einen Bereich von Indizes mit : angeben.

d = a[:5]     ## 'Hello'
e = a[6:]     ## 'world'
f = a[3:8]    ## 'lo wo'
g = a[-5:]    ## 'world'

Das Zeichen am Endindex ist nicht enthalten. Fehlende Indizes nehmen den Anfang oder das Ende der Zeichenkette an.

String-Operationen

Verknüpfung, Länge, Mitgliedschaft und Replikation.

## Verknüpfung (+)
a = 'Hello' + 'World'   ## 'HelloWorld'
b = 'Say'+ a          ## 'Say HelloWorld'

## Länge (len)
s = 'Hello'
len(s)                  ## 5

## Mitgliedschaftstest (`in`, `not in`)
t = 'e' in s            ## True
f = 'x' in s            ## False
g = 'hi' not in s       ## True

## Replikation (s * n)
rep = s * 5             ## 'HelloHelloHelloHelloHello'

String-Methoden

Strings haben Methoden, die verschiedene Operationen mit den String-Daten ausführen.

Beispiel: Entfernen von führenden / nachfolgenden Leerzeichen.

s ='  Hello '
t = s.strip()     ## 'Hello'

Beispiel: Groß-/Kleinschreibung umwandeln.

s = 'Hello'
l = s.lower()     ## 'hello'
u = s.upper()     ## 'HELLO'

Beispiel: Text ersetzen.

s = 'Hello world'
t = s.replace('Hello', 'Hallo')   ## 'Hallo world'

Weitere String-Methoden:

Strings haben eine Vielzahl von anderen Methoden zum Testen und Bearbeiten von Text-Daten. Dies ist ein kleiner Auszug von Methoden:

s.endswith(suffix)     ## Überprüfen, ob der String mit suffix endet
s.find(t)              ## Erstes Vorkommen von t in s
s.index(t)             ## Erstes Vorkommen von t in s
s.isalpha()            ## Überprüfen, ob die Zeichen alphabetisch sind
s.isdigit()            ## Überprüfen, ob die Zeichen numerisch sind
s.islower()            ## Überprüfen, ob die Zeichen in Kleinbuchstaben sind
s.isupper()            ## Überprüfen, ob die Zeichen in Großbuchstaben sind
s.join(slist)          ## Verknüpfen einer Liste von Strings mit s als Trennzeichen
s.lower()              ## In Kleinbuchstaben umwandeln
s.replace(old,new)     ## Text ersetzen
s.rfind(t)             ## Suchen nach t von Ende des Strings
s.rindex(t)            ## Suchen nach t von Ende des Strings
s.split([delim])       ## String in Liste von Teilstrings aufteilen
s.startswith(prefix)   ## Überprüfen, ob der String mit prefix beginnt
s.strip()              ## Führende/Nachfolgende Leerzeichen entfernen
s.upper()              ## In Großbuchstaben umwandeln

String-Immutabilität

Strings sind "immutable" oder schreibgeschützt. Einmal erstellt, kann der Wert nicht geändert werden.

>>> s = 'Hello World'
>>> s[1] = 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError:'str' object does not support item assignment
>>>

Alle Operationen und Methoden, die String-Daten manipulieren, erzeugen immer neue Strings.

String-Konvertierungen

Verwenden Sie str(), um einen beliebigen Wert in einen String zu konvertieren. Das Ergebnis ist ein String, der denselben Text enthält, den die print()-Anweisung erzeugt hätte.

>>> x = 42
>>> str(x)
'42'
>>>

Byte-Strings

Eine Zeichenkette von 8-Bit-Byte, die bei der niederen Ebene der I/O häufig vorkommt, wird wie folgt geschrieben:

data = b'Hello World\r\n'

Indem Sie ein kleines b vor der ersten Anführungszeichen setzen, geben Sie an, dass es sich um eine Byte-Zeichenkette handelt, im Gegensatz zu einer Textzeichenkette.

Die meisten üblichen String-Operationen funktionieren.

len(data)                         ## 13
data[0:5]                         ## b'Hello'
data.replace(b'Hello', b'Cruel')  ## b'Cruel World\r\n'

Das Indexieren ist etwas anders, da es Byte-Werte als Integer zurückgibt.

data[0]   ## 72 (ASCII-Code für 'H')

Konvertierung zu/aus Textzeichenketten.

text = data.decode('utf-8') ## bytes -> text
data = text.encode('utf-8') ## text -> bytes

Das Argument 'utf-8' gibt eine Zeichensatzkodierung an. Andere übliche Werte sind 'ascii' und 'latin1'.

Rohstrings

Rohstrings sind String-Literale mit einem nicht interpretierten Backslash. Sie werden durch Präfixieren der anfänglichen Anführungszeichen mit einem kleinen "r" angegeben.

>>> rs = r'c:\newdata\test' ## Roh (nicht interpretierten Backslash)
>>> rs
'c:\\newdata\\test'

Der String ist der literale Text, der darin eingeschlossen ist, genau wie er eingegeben wurde. Dies ist nützlich in Situationen, in denen der Backslash besondere Bedeutung hat. Beispiel: Dateiname, reguläre Ausdrücke usw.

f-Strings

Eine Zeichenkette mit formatierter Ausdruckssubstitution.

>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> a = f'{name:>10s} {shares:10d} {price:10.2f}'
>>> a
'       IBM        100      91.10'
>>> b = f'Cost = ${shares*price:0.2f}'
>>> b
'Cost = $9110.00'
>>>

Hinweis: Dies erfordert Python 3.6 oder neuer. Die Bedeutung der Formatcodes wird später behandelt.

In diesen Übungen werden Sie mit Operationen auf Python's String-Typ experimentieren. Sie sollten dies an der Python interaktiven Eingabeaufforderung machen, wo Sie die Ergebnisse leicht sehen können. Wichtiger Hinweis:

In Übungen, in denen Sie mit dem Interpreter interagieren sollen, ist >>> der Interpreter-Prompt, den Sie erhalten, wenn Python Sie auffordert, eine neue Anweisung einzugeben. Einige Anweisungen in der Übung umfassen mehrere Zeilen - um diese Anweisungen auszuführen, müssen Sie möglicherweise einige Male 'Return' drücken. Ein erneuter Hinweis: Sie TIppen NICHT das >>> ein, wenn Sie diese Beispiele ausprobieren.

Beginnen Sie mit der Definition einer Zeichenkette, die eine Reihe von Aktiensymbole enthält, wie folgt:

>>> symbols = 'AAPL,IBM,MSFT,YHOO,SCO'
>>>

Übung 1.13: Extrahieren einzelner Zeichen und Teilzeichenketten

Zeichenketten sind Arrays von Zeichen. Versuchen Sie, ein paar Zeichen zu extrahieren:

>>> symbols[0]
?
>>> symbols[1]
?
>>> symbols[2]
?
>>> symbols[-1]        ## Letztes Zeichen
?
>>> symbols[-2]        ## Negative Indizes beginnen am Ende der Zeichenkette
?
>>>

In Python sind Zeichenketten schreibgeschützt.

Verifizieren Sie dies, indem Sie versuchen, das erste Zeichen von symbols in einen Kleinbuchstaben 'a' umzuwandeln.

>>> symbols[0] = 'a'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>

Übung 1.14: Stringverkettung

Obwohl String-Daten schreibgeschützt sind, können Sie jederzeit eine Variable neu zuweisen, um einen neu erstellten String zu erhalten.

Versuchen Sie die folgende Anweisung, die ein neues Symbol "GOOG" am Ende von symbols anfügt:

>>> symbols = symbols + 'GOOG'
>>> symbols
'AAPL,IBM,MSFT,YHOO,SCOGOOG'
>>>

Ups! Das war nicht das, was Sie wollten. Beheben Sie es, so dass die Variable symbols den Wert 'AAPL,IBM,MSFT,YHOO,SCO,GOOG' enthält.

>>> symbols =?
>>> symbols
'AAPL,IBM,MSFT,YHOO,SCO,GOOG'
>>>

Fügen Sie 'HPQ' am Anfang der Zeichenkette hinzu:

>>> symbols =?
>>> symbols
'HPQ,AAPL,IBM,MSFT,YHOO,SCO,GOOG'
>>>

In diesen Beispielen sieht es so aus, als würde die ursprüngliche Zeichenkette modifiziert werden, was offensichtlich gegen die schreibgeschützte Natur von Zeichenketten verstößt. Tatsächlich nicht. Jede Operation auf Zeichenketten erzeugt jeweils einen völlig neuen String. Wenn die Variablenname symbols neu zugewiesen wird, verweist er auf den neu erstellten String. Danach wird die alte Zeichenkette zerstört, da sie nicht mehr verwendet wird.

Übung 1.15: Prüfung auf Mitgliedschaft (Prüfung auf Teilzeichenkette)

Experimentieren Sie mit dem in-Operator, um nach Teilzeichenketten zu suchen. Am interaktiven Prompt versuchen Sie diese Operationen:

>>> 'IBM' in symbols
?
>>> 'AA' in symbols
True
>>> 'CAT' in symbols
?
>>>

Warum hat die Prüfung auf 'AA' True zurückgegeben?

Übung 1.16: String-Methoden

Am Python interaktiven Prompt können Sie mit einigen der String-Methoden experimentieren.

>>> symbols.lower()
?
>>> symbols
?
>>>

Denken Sie daran, dass Strings immer schreibgeschützt sind. Wenn Sie das Ergebnis einer Operation speichern möchten, müssen Sie es in eine Variable ablegen:

>>> lowersyms = symbols.lower()
>>>

Versuchen Sie einige weitere Operationen:

>>> symbols.find('MSFT')
?
>>> symbols[13:17]
?
>>> symbols = symbols.replace('SCO','DOA')
>>> symbols
?
>>> name = '   IBM   \n'
>>> name = name.strip()    ## Entfernt die umgebenden Leerzeichen
>>> name
?
>>>

Übung 1.17: f-Strings

Manchmal möchten Sie einen String erstellen und die Werte von Variablen darin einfügen.

Um das zu tun, verwenden Sie einen f-String. Beispielsweise:

>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{shares} shares of {name} at ${price:0.2f}'
'100 shares of IBM at $91.10'
>>>

Ändern Sie das mortgage.py-Programm aus Übung 1.10, um seine Ausgabe mit f-Strings zu erstellen. Versuchen Sie, es so zu gestalten, dass die Ausgabe gut ausgerichtet ist.

✨ Lösung prüfen und üben

Übung 1.18: Reguläre Ausdrücke

Eine Einschränkung der grundlegenden String-Operationen ist, dass sie keine Art von fortgeschrittenen Mustervergleichen unterstützen. Dazu müssen Sie sich auf das re-Modul von Python und reguläre Ausdrücke verlassen. Das Thema der Behandlung regulärer Ausdrücke ist ein umfangreiches Thema, aber hier ist ein kurzes Beispiel:

>>> text = 'Today is 3/27/2018. Tomorrow is 3/28/2018.'
>>> ## Findet alle Vorkommen eines Datums
>>> import re
>>> re.findall(r'\d+/\d+/\d+', text)
['3/27/2018', '3/28/2018']
>>> ## Ersetzt alle Vorkommen eines Datums durch Ersatztext
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
'Today is 2018-3-27. Tomorrow is 2018-3-28.'
>>>

Weitere Informationen über das re-Modul finden Sie in der offiziellen Dokumentation unter https://docs.python.org/library/re.html.

Kommentar

Wenn Sie beginnen, mit dem Interpreter zu experimentieren, möchten Sie oft mehr über die von verschiedenen Objekten unterstützten Operationen wissen. Beispielsweise wie können Sie herausfinden, welche Operationen auf einem String verfügbar sind?

Je nach Ihrem Python-Umgebung können Sie möglicherweise eine Liste der verfügbaren Methoden über die Tab-Vervollständigung sehen. Beispielsweise versuchen Sie, dies einzugeben:

>>> s = 'hello world'
>>> s.<tab taste>
>>>

Wenn das Drücken der Tab-Taste nichts bewirkt, können Sie auf die integrierte dir()-Funktion zurückgreifen. Beispielsweise:

>>> s = 'hello'
>>> dir(s)
['__add__', '__class__', '__contains__',..., 'find', 'format',
'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit',
'rstrip','split','splitlines','startswith','strip','swapcase',
'title', 'translate', 'upper', 'zfill']
>>>

dir() liefert eine Liste aller Operationen, die nach dem (.) erscheinen können. Verwenden Sie die help()-Anweisung, um weitere Informationen über eine bestimmte Operation zu erhalten:

>>> help(s.upper)
Hilfe zu eingebauter Funktion upper:

upper(...)
    S.upper() -> string

    Gibt eine Kopie der Zeichenkette S in Großbuchstaben zurück.
>>>

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Strings-Labor abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.