Reguläre Ausdrücke

In Strings kann man meist einfache Teil-Strings suchen und evt. ersetzen. Hierzu kann man die einfachen String-Methoden index, rindex, find, rfind, replace und deb Operator in verwenden.

Mit Hilfe von regulären Ausdrücken kann man in Strings nach komplizierten Mustern suchen und Teile des Strings ersetzen. Eine ausführliche Beschreibung mit Beispielen zu regulären Ausdrücken gibt es unter: Regular Expressions

Das Python Modul re stellt zahlreiche Funktionen zur Verwendung von regulären Ausdrücken zur Verfügung.

re.search im Vergleich zu in:

>>> import re
>>> input = 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'
>>> re.search(r'Taxi', input)
<_sre.SRE_Match object at 0x7f9d50536e68>
>>> 'Taxi' in input
True
>>> re.search(r'Bus', input)
>>> 'Bus' in input
False

Ein String, der mit r eingeleitet wird, heisst ,roher' String. In diesem müssen keine backslashes entwertet werden, d.h. man gibt in Folgendem Beispiel entweder r'\bTaxi\b' oder '\\bTaxi\\b' an.

Falls nach einzelnen Wörtern gesucht werden soll, zeigt re.search mit dem Extra Parameter \b seinen Vorteil ( \b ist “Wild-card” für Wort-Grenze):

>>> input1 = 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'
>>> input2 = 'Der Taxibus ist zu spaet'
>>> 'Taxi' in input1, 'Taxi' in input2
(True, True)
>>> re.search(r'\bTaxi\b', input1), re.search(r'\bTaxi\b', input2)
(<_sre.SRE_Match object at 0x7f9d50536ed0>, None)

Zum Ersetzen benutzt man re.sub:

>>> input1 = 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'
>>> output=re.sub(r'Taxi','Bus',input)
>>> output
'Franz jagt im komplett verwahrlosten Bus quer durch Bayern'

Mit dem match Objekt kann man auf Teile des String zurückgreifen, die zu regulären Ausdrücken passen. Mit

r'(\b\w+\b)\s+\1'
lässt sich nach einem doppelt vorkommendem Wort suchen:

>>> input = 'Franz jagt im komplett verwahrlosten Taxi quer quer durch Bayern'
>>> mo=re.search(r'(\b\w+\b)\s+\1',input)
>>> mo
<_sre.SRE_Match object at 0x7f9d50555300>
>>> mo.group(0)
'quer quer'
>>> mo.group(1)
'quer'
>>> mo.start()
42
>>> mo.span()
(42, 51)
>>> input[42: 51]
'quer quer'

re.search liefert nur das erste Vorkommen eines Such-Musters. Alle Vorkommen erhält man mit re.findall oder re.finditer.

Ein schnelleren Zugriff auf Suchergebnisse vorallem bei grösseren Strings oder dem zeilenweisen Lesen/Suchen durch eine Datei erhält man mit re.compile. Der Such-Begriff wird einmal “kompiliert” und kann anschliessend wiederverwendet werden.:

>>> input3 = 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'
>>> input4 = 'Franz jagt im komplett verwahrlosten Taxi quer quer durch Bayern'
>>> regdoub = re.compile(r'(\b\w+\b)\s+\1')
>>> regdoub
<_sre.SRE_Pattern object at 0xb75c71a0>
>>> regdoub.search(input3)
>>> regdoub.search(input4)
<_sre.SRE_Match object at 0xb75999a0>
>>> regdoub.sub(r'\1',input3)
'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'
>>> regdoub.sub(r'\1',input4)
'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'

Mit dem Python Modul fnmatch kann mit der Unix Dateiname-Suche Konvention in strings gesucht werden. Hierbei werden die von der bash-Kommandozeile bekannten Regeln verwendet:

* 	entspricht allem
? 	entpricht einem Buchstaben
[seq] 	entspricht einem Buchstaben in seq
[!seq] 	entspricht einem Buchstaben nicht in seq

Folgendes Beispiel zeigt alle Dateinamen im aktuellen Verzeichnis mit der Endung .txt:

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)