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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Antworten