Python Material Installation Dokumentation PythonKara Grundlagen Namensräume Funktionen Testen Strings Dictionary Listen Zeitmessungen Zufall Bits+Bytes Module Sockets xml serielle Schnittstelle Python in HTML Turtle xturtle Tkinter OOP Threads Zusicherungen exe Patterns GnuPlot Goto MySQL CGI Dateien Exceptions Grafik Mathematik Fischertechnik Unicode funktional Iterator Sound C Debugger regex Pfade Docstrings Django Bluetooth format Bytecode signal
Pfad: Startseite / Fächer / Informatik / Python / regex
Autor: mk
13.10.2011 18:16:06
816
reguläre Ausdrücke

Beispiel 1

>>> s = 'Ali Baba und die vierzig Räuber'
>>> i = re.finditer(r'[bB]\w',s)
>>> m = next(i)
>>> m.group()
'Ba'
>>> m.start()
4
>>> m.end()
6
>>> m = next(i)
>>> m.group()
'ba'
>>> m.start()
6
>>> m.end()
8
>>> m = next(i)
>>> m.group()
'be'
>>> m.start()
28
>>> m.end()
30
>>> m = next(i)
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    m = next(i)
StopIteration

Durch runde Klammern kann man einen regulären Ausdruck in Gruppen aufteilen.

>>> s = 'Ali Baba und die vierzig Räuber'
>>> i = re.finditer(r'([bB])(\w)',s)
>>> m = next(i)
>>> m.group(0)
'Ba'
>>> m.group(1)
'B'
>>> m.group(2)
'a'
>>> m.group(3)
Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    m.group(3)
IndexError: no such group

Akzeptor

Nehmen wir an, wir suchen ein Binärmuster, das dem regulären Ausdruck ⟨1{1,3}|10|01{0,3}⟩ (andere Schreibweisen: ⸢1{1,3}|10|01{0,3}⸥ (Jeffrey Friedl) oder einfach 1{1,3}|10|01{0,3} (ohne Klammer, wenn kein Missverständnis zu befürchten ist ) entspricht.

>>> re.findall(r'1{1,3}|10|01{0,3}','1111')
['111', '1']
>>> re.findall(r'1{1,3}|10|01{0,3}','10')
['1', '0']

Im ersten Beispiel wird der nicht zu akzeptierende String in zwei akzeptierte zerlegt. Im zweiten Beispiel wird '1' und '0' gefunden, nicht aber '10'. Sorgt man dafür, dass der Anfang des Strings auch der Anfang des gefundenen Strings ist und das Ende des Strings das Ende des gefundenen Strings, so wird versucht, den ganzen String zu 'matchen'.

>>> re.findall(r'\A(1{1,3}|10|01{0,3})\Z','10')
['10']
>>> re.findall(r'\A(1{1,3}|10|01{0,3})\Z','1111')
[]

Bessere Möglichkeit?

import re

def test(r,s):
    """
    gibt genau dann wahr zurueck, wenn der String s dem regulaeren
    Ausdruck r entspricht
    """
    ro = re.compile('\A('+r+')\Z')
    return ro.search(s) != None

Tests

>>> test(r'(1{1,3}|10|01{0,3})','1111')
False
>>> test(r'(1{1,3}|10|01{0,3})','111')
True
>>> test(r'(1{1,3}|10|01{0,3})','0111')
True
>>> test(r'(1{1,3}|10|01{0,3})','01110')
False
>>> 

Links