HSG |
|
>>> 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
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') []
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 >>>