Kapitel 13
Verarbeitung von Zeichenketten
386
wird gewährleistet, dass Punkte in Gleitkommazahlen oder URLs nicht als Satztrennungs-
zeichen interpretiert werden.
#2: Der Text wird in eine Liste von Sätzen aufgespalten. Deren Länge ist die Anzahl der
Sätze.
#3: text.split() liefert eine Liste aller Wörter (Default-Trennsymbol ist das Leerzeichen).
Die Länge dieser Liste ist die Anzahl der Wörter.
13.5.6 Teilstrings ersetzen mit sub()
Ein Aufruf re.sub(replace, string) liefert eine Zeichenkette, die aus dem String im
zweiten Argument nach folgendem Verfahren berechnet wird: Von links beginnend werden
nicht überlappende Vorkommen von Teilstrings, auf die der reguläre Ausdruck von
re passt,
durch den String
replace ersetzt. Im folgenden Beispiel werden Zahlenangaben durch
Unterstriche ersetzt:
Sollen nicht alle passenden Teilstrings ersetzt werden, kann als drittes Argument die Anzahl
der Ersetzungen angegeben werden.
13.5.7 Match-Objekte
Die Methoden search() und match() geben ein so genanntes Match-Objekt zurück, falls
der reguläre Ausdruck auf den geprüften String passt. Es kann durch Abfragen von Attribu-
ten bzw. Aufruf von Methoden ausgewertet werden.
In Dialogsystemen verwendet man Match-Objekte, um zu einer Eingabe eine passende Ant-
wort zu generieren, in der Teile des Eingabestrings verwendet werden. Das folgende Skript
implementiert einen sehr beschränkten Chat Bot, der sich wie ein Gesprächspsychologe ver-
hält. Er reagiert auf einige wenige Textmuster in der Weise, dass er den Gesprächspartner
zum Weitererzählen ermuntert.
>>> s = 'Das Auto kostet 1756.90 Euro.'
>>> re = compile('\d')
>>> print(re.sub('_', s))
Das Auto kostet ____.__Euro.
Attribut /Methode Erklärung
end() Liefert den Index vom Ende des längsten passenden Teilstrings.
re Der reguläre Ausdruck (als RE-Objekt), der beim Aufruf von
search() oder match() verwendet wurde
start() Liefert den Index des Anfangs des passenden Teilstrings.
string Der String, der geprüft wurde
Tabelle 13.12: Die wichtigsten Methoden und Attribute von Match-Objekten
387
13.5
Reguläre Ausdrücke
Zum Beispiel wird aus dem Satz
»Alle lachen über mich!«
die folgende Antwort generiert:
»Wer lacht über Sie? Denken Sie an bestimmte Personen?«
Die Konstruktion der Antwort funktioniert im Prinzip folgendermaßen:
Aus der Eingabe wird ein Satz extrahiert, der mit alle, gefolgt von einem Verb (Wort mit
Endung
en) beginnt.
In diesem Satz werden einige Strings gemäß Abbildung 13.5 durch neue Strings ersetzt.
Das ergibt den ersten Satz der Antwort.
Abb. 13.5: Konstruktion einer Antwort durch Ersetzungen
Das folgende Skript zeigt, wie man für die Ersetzungen Match-Objekte verwendet.
Skript:
# chat.py
fro m re i m port *
class Chat (object):
d e f __a l l e(s e lf, e ):
re1 = compile('alle \w\w+en', I) #1
r e 2 = c o m pil e ('a l l e', I ) #2
re3 = compile('[.!,;]+') #3
m 1 = re 1 . sea r ch( e )
m2 = re2.search(e)
i f m1:
passendesStueck1 = m1.string[m1.start():m1.end()] #4
verb = passendesStueck1.split()[1] #5
s tam m = ve r b [:- 2 ] #6
passendesStueck2 = m2.string[m2.start():] #7
satz = re3.split(passendesStueck2) [0] #8
restsatz = passendesStueck2.split(' ',2)[2] #9
restsatz = restsatz.replace('mich','Sie')
restsatz = restsatz.replace('mein', 'Ihr')
antwort = 'Wer {}t {}?'.format(stamm, restsatz)
antwort += ' Denken Sie an bestimmte Personen?'
return antwort
Alle lachen ueber mich !
Wer t Sie ?
Kapitel 13
Verarbeitung von Zeichenketten
388
Erläuterung:
#1: Dieser reguläre Ausdruck spezifiziert Strings, die das Wort alle enthalten, gefolgt von
einem Leerzeichen und einem Wort mit mindestens vier Buchstaben, das mit
en endet.
#2: r2 passt auf Strings, die mit alle beginnen.
#3: r3 spezifiziert eine Folge von Satzzeichen.
#4: m1 ist ein Match-Objekt, das mithilfemithilfe des RE-Objektes re1 gewonnen wurde. m1.
start()
und m1.end() liefern Anfangs- und Endposition des längsten Teilstrings der Ein-
gabe, der auf den regulären Ausdruck von
r1 passt. Somit erhält die Variable passendes-
Stueck1
(idealerweise) einen String, der aus dem Wort alle und einem nachfolgenden
Verb besteht.
#5: Dieser String wird in zwei Wörter aufgespalten, das Verb ist das zweite Wort.
#6: Der Wortstamm des Verbs ist das Verb ohne die letzten beiden Buchstaben en.
#7: passendesStueck2 ist ein Teilstring der Eingabe e, der mit alle beginnt und bis zum
Ende der Eingabe geht.
de f _ _fa m ilie ( sel f , e) :
re = compile('bruder|schwester|mutter|vater', I)
if re.search(e):
antwort = 'Erzählen Sie mir mehr über Ihre Familie.'
return antwort
def __negativ(self, e):
re = compile('nein|nicht|kein', I)
if re.search(e):
antwort = 'Denken Sie nicht ein bisschen negativ?'
return antwort
def chat(self):
print('Hallo, ich bin Mini-Eliza.')
e = input('Sie: ')
while e:
if self.__alle(e): print(self.__alle(e))
elif self.__familie(e): print(self.__familie(e))
elif self.__negativ(e): print(self.__negativ(e))
else: print('Aha ...')
e = input('Sie: ')
print('Auf Wiedersehen!')
chat = Chat()
chat.chat()

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.