»Some people, when confronted with a problem, think ›I know, I’ll use regular expressions.‹ Now they have two problems.« – Jamie W. Zawinski
15 Strings
In diesem Kapitel möchten wir einige Module vorstellen, die komfortable Funktionalität bereitstellen, die im engen Zusammenhang mit Strings steht.
15.1 Arbeiten mit Zeichenketten – string 

Ursprünglich sollte das Modul string Funktionen enthalten, die zur Manipulation von Strings gedacht waren. Diese wurden jedoch im Laufe der Entwicklung von Python zu Methoden des Datentyps str, und das Modul string wurde damit weitestgehend obsolet. Dennoch enthält das Modul einige wichtige Konstanten und, was weitaus interessanter ist, eine Template Engine, die wir in Abschnitt 15.1.1 behandeln werden. Doch kommen wir zunächst zu den in string definierten Konstanten.
Konstanten
Die im Modul string enthaltenen Konstanten sind allesamt Strings, die Zeichen eines bestimmten Typs enthalten. Auf diese Weise lässt sich einfach testen, ob ein eingelesenes Zeichen dem gewünschten Typ angehört oder ob die Eingabe ungültig war. Besonders interessant wird dies im Hinblick auf Lokalisierungen, denn es gibt Zeichen, die nur in einigen wenigen Sprachen zu den Buchstaben oder Satzzeichen gehören, wie beispielsweise die deutschen Umlaute oder das spanische umgekehrte Fragezeichen.
Beachten Sie, dass sich Konstanten, die auf einer Lokalisierung basieren, automatisch ändern, wenn die Lokalisierung des Betriebssystems geändert wurde.
| Wert | Bedeutung |
|
ascii_letters |
Enthält alle Buchstaben des ASCII-Standards, also alle Buchstaben des englischen Alphabets, jeweils in ihrer großen und kleinen Form. 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' |
|
ascii_lowercase |
Wie ascii_letters, jedoch sind nur Kleinbuchstaben enthalten. 'abcdefghijklmnopqrstuvwxyz' |
|
ascii_uppercase |
Wie ascii_letters, jedoch sind nur Großbuchstaben enthalten. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
|
digits |
Enthält alle Ziffern von 0 bis 9. '0123456789' |
|
hexdigits |
Enthält alle hexadezimalen Ziffern von 0 bis F bzw. f. '0123456789abcdefABCDEF' |
|
letters |
Enthält alle Buchstaben der aktuellen Lokalisierung. |
|
lowercase |
Enthält alle Kleinbuchstaben der aktuellen Lokalisierung. |
|
octdigits |
Enthält alle oktalen Ziffern von 0 bis 7. '01234567' |
|
punctuation |
Enthält alle Satzzeichen der aktuellen Lokalisierung. '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' |
|
printable |
Enthält alle druckbaren Zeichen. Das ist eine Kombination aus digits, letters, punctuation und whitespace. |
|
uppercase |
Enthält alle Großbuchstaben der aktuellen Lokalisierung. |
|
whitespace |
Enthält alle Whitespace-Zeichen wie beispielsweise ein Tabulator- oder ein Leerzeichen. '\t\n\x0b\x0c\r ' |
Eingangs wurde bereits erwähnt, für welchen Zweck die aufgelisteten Konstanten gedacht sind. Im folgenden Beispiel soll ihre Verwendung demonstriert werden:
import string
c = raw_input("Ein englischer Kleinbuchstabe bitte: ") if len(c) != 1: print "Ein Buchstabe, kein Roman" elif c not in string.ascii_lowercase: print "Falsche Eingabe"
Nachdem eine Eingabe vom Benutzer gefordert wurde, wird sie auf ihre Länge geprüft, und anschließend wird getestet, ob der Buchstabe in string.ascii_lowercase enthalten ist.
15.1.1 Ein einfaches Template-System 

Abgesehen von den soeben besprochenen Konstanten enthält das Modul string die Klasse Template, die ein simples Template-System darstellt. Ein solches Template-System ermöglicht es, einen String mit Platzhaltern zu versehen und diese später durch dynamisch erstellte Werte aufzufüllen.
Im Grunde genommen kann Pythons %-Syntax auch als Template-System angesehen werden:
>>> "%s ist %s" % ("Python", "gut")
'Python ist gut'Diese Syntax ist an C angelehnt und sehr mächtig. Das Ziel der Template-Klasse dagegen ist es, ein möglichst einfaches Template-System zu implementieren, das zwar in seinem Funktionsumfang und seiner Flexibilität stark eingeschränkt, dafür aber sehr einfach zu benutzen ist.
Bei der Instanziierung der Template-Klasse wird der String mit den Platzhaltern übergeben:
>>> from string import Template >>> t = Template("$was ist $wie")
Ein Platzhalter wird im String durch ein Dollar-Zeichen und einen darauf folgenden Bezeichner gekennzeichnet. In diesem Fall wurden die Platzhalter $was und $wie eingebettet.
Durch Aufruf der Methode substitute einer Template-Instanz können die Platzhalter durch Werte ersetzt werden:
>>> t.substitute(was="Python", wie="gut") 'Python ist gut' >>> t.substitute(wie="mittel", was="Java") 'Java ist mittel'
Als Parameter der Methode substitute können beliebig viele keyword arguments übergeben werden, die jeweils dem Namen des Platzhalters entsprechen müssen. Zudem ist es möglich, der Methode ein Dictionary zu übergeben, das die Namen der Platzhalter und die einzutragenden Werte als Schlüssel/Wert-Paare enthält.
Die Instanzen, durch die die Platzhalter ersetzt werden, müssen keineswegs ausschließlich Strings sein, wie folgendes Beispiel zeigt:
>>> t.substitute(was=[1,2,3], wie=23) '[1, 2, 3] ist 23'
Neben substitute existiert eine weitere Methode namens safe_substitute, die über die gleiche Schnittstelle wie substitute verfügt. Der Unterschied zwischen den beiden Methoden ist der, dass substitute eine Exception wirft, wenn bei einem Aufruf ein Platzhalter nicht ersetzt wird, während safe_substitute einen solchen Umstand schlicht ignoriert.
>>> t.substitute(was="Python") Traceback (most recent call last): […] KeyError: 'wie' >>> t.safe_substitute(was="Python") 'Python ist $wie'
Abschließend noch zwei Bemerkungen zu den Platzhaltern im String. Betrachten Sie einmal folgendes Beispiel:
>>> t = Template("Alles Gute zum $gebten Geburtstag")Der Platzhalter heißt eigentlich nur $geb, wird aber direkt von weiterem Text im String gefolgt, sodass der Name unglücklicherweise zu $gebten wird. Für solche Fälle ist es möglich, den Bezeichner des Platzhalters in geschweifte Klammern zu fassen:
>>> t = Template("Alles Gute zum ${geb}ten Geburtstag")
>>> t.substitute(geb=21)
'Alles Gute zum 21ten Geburtstag'Problematisch ist außerdem, dass das Dollar-Zeichen sozusagen belegt ist, sodass Sie es nicht einfach so innerhalb des Strings verwenden können. Dieses Problem können Sie folgendermaßen umschiffen:
>>> t = Template("Python kostet $preis$$")
>>> t.substitute(preis=0)
'Python kostet 0$'Ein doppeltes Dollar-Zeichen wird im fertigen String durch ein einzelnes Dollar-Zeichen ersetzt.




bestellen





