Die Webseiten der Fachschaft Informatik am ERG Saalfeld


Problem mit split

Auf der Seite "Wörter zählen" gab es eine Aufgabe, dass das Programm die Wörter zählte und diese Anzahl durch nachzählen überprüft werden sollte. Diese Anzahl konnte nur sehr selten bestätigt werden. Anders formuliert: die durch das Programm bestimmte Anzahl war in den meisten Fällen falsch.
 

Es soll jetzt dieser Satz an den Leerzeichen zerlegt und dann die Wörter gezählt werden:

'Wir splitten  diese   Zeile    mit     Leerzeichen.'

Das Besondere an diesem Text ist, dass hier mehrere Leerzeichen verwendet werden und wir wollen ja genau an den Leerzeichen splitten. Damit wir die Leerzeichen besser zählen können, wird hier der Satz auch so angegeben, dass zwischen den Wörtern statt Leerzeichen Punkte geschrieben werden, also so:

'Wir.splitten..diese...Zeile....mit.....Leerzeichen.'

Dieser Satz mit den Punkten dient nur zum Vergleich. Der wird nicht gesplittet. Da er bleibt, schreiben wir den als erste Zeile. Außerdem ersetzen wir noch das letzte Wort, damit es inhaltlich stimmt. Also jetzt so:

'Wir.splitten..diese...Zeile....mit.....Punkten nicht.'
'Wir splitten  diese   Zeile    mit     Leerzeichen.'

Programm

# unser Text
zeile1 = 'Wir.splitten..diese...Zeile....mit.....Punkten nicht.'
zeile2 = 'Wir splitten  diese   Zeile    mit     Leerzeichen.'

# wir geben diese Strings aus
print(zeile1)
print(zeile2)

# wir zerlegen ("splitten") zeile2 an den Leerzeichen als Trennzeichen
temp  = zeile2.split(" ")    # zwischen den zwei Anführungszeichen steht ein Leerzeichen!

# wir ermitteln die Anzahl der Elemente in temp
anzahl = len(temp)

# wir geben diese Anzahl aus
print("")
print("In der Liste 'temp' sind", anzahl, "Wörter")
print("")

# Ausgabe der Elemente der Liste
print("wir geben die Elemente von temp aus, jedes in einer Zeile:")
for element in temp:
  print(element)

 

Der Aufruf sah bei mir so aus:


Das ist nicht das Ergebnis, was wir erwartet haben. Es sind offensichtlich 6 Wörter und nicht 16. Da jedes Element der Liste in einer Zeile ausgegeben wurde, erkennt man leicht, dass in der Liste etliche Leerzeichen sind. D.h. so ist das Splitten nicht sinnvoll.

 

Lösung

Wir verwenden einen regulären Ausdruck. Wir wollen ja gar nicht an einem Leerzeichnen trennen, sondern unser Trenner sollen alle Leerzeichen zwischen den Wörtern sein. Dazu schreibt man hinter den Trenner ein Plus, was bedeutet, der Trenner ist ein oder mehrere Leerzeichen. Da eine Regex (im Normalfall) gierig ist, bedeutet das, dass alle Leerzeichen als Trenner verwendet werden.
Allerdings funktioniert der Befehl split nicht mit regulären Ausdrücken. Wir verwenden das Modul "re" für die regulären Ausdrücke und den Befehl split aus diesem Modul. Das Programm sieht jetzt so aus:

import re

# unser Text
zeile1 = 'Wir.splitten..diese...Zeile....mit.....Punkten nicht.'
zeile2 = 'Wir splitten  diese   Zeile    mit     Leerzeichen.'

# wir geben diese Strings aus
print(zeile1)
print(zeile2)

# wir zerlegen ("splitten") zeile2 an den Leerzeichen als Trennzeichen
temp  = re.split(" +",zeile2)   # vor dem Plus steht ein Leerzeichen!

# wir ermitteln die Anzahl der Elemente in temp
anzahl = len(temp)

# wir geben diese Anzahl aus
print("")
print("In der Liste 'temp' sind", anzahl, "Wörter")
print("")

# Ausgabe der Elemente der Liste
print("wir geben die Elemente von temp aus, jedes in einer Zeile:")
for element in temp:
  print(element)

 

Der Aufruf sah bei mir nun so aus:

Jetzt erhalten wir unser gewünschtes Ergebnis.

Anmerkung: Es ist aber nicht besonders gut lesbar, wenn man ein Leerzeichen als Zeichen schreibt. Genau das war ja auch das Problem mit der Aufgabe. Es ist besser, die besondere Zeichenklasse '\s' zu verwenden (siehe hier). Dann würde die Zeile mit dem split-Befehl so aussehen:

temp = re.split("\s+",zeile2)

 

zurück


© ERG Saalfeld   -   HD. Kirmse     letztes Update 30.03.2023