Seite 1 von 1

Warum nicht matchobj.group(*0*)...

Verfasst: Freitag 2. September 2005, 21:31
von jens
Bin gerade darüber gestolpert, das bei einem RE matchobj.group() nicht mit 0 angefangen wird, sondern mit 1...
OK, ist evtl. logischer, weil von wegen das "nullte-Objekt"... Aber bei Listen fängt man ja auch immer mit 0 an... drum wäre es eigentlich einheitlicher, wenn's bei re auch so wäre, oder???

Verfasst: Freitag 2. September 2005, 21:48
von mawe
Hi jens!

Ähm, fängt doch eh bei 0 an, oder?

Code: Alles auswählen

>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
Gruß, mawe

Verfasst: Freitag 2. September 2005, 22:28
von jens
Hm! Nun hab ich mir einen kleinen Test gebaut:

Das verstehe ich nicht:

Code: Alles auswählen

import re

for m in re.finditer( "(.*?)(<.*?>)(.*?)(?us)", "a<b>c" ):
    print "0:",m.group(0)
    print "1:",m.group(1)
    print "2:",m.group(2)
raus kommt:
0: a<b>
1: a
2: <b>
erwartet hätte ich:
0: a
1: <b>
2: c

Verfasst: Freitag 2. September 2005, 22:43
von mawe
Hi!

Ok, so seh ich das:
group(0) enthält den gesamten String, auf den das Pattern passt. Die restlichen group Elemente sind dann die Matches die mit den Klammern eingefangen werden. Gut.
Warum wird das c nicht gematcht? Naja, worauf passte denn (.*?)? Auf irgendein Zeichen (.), das 0 oder mehrmals vorkommen kann (*), so kurz wie möglich (nongreedy) (?). Ok, aber der kürzeste String auf den das passt, ist eben ein String der Länge 0 :)

PS: Mit m.groups() kannst Du dir gleich alle Matches auf einmal anschaun.

Gruß, mawe