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