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???
Warum nicht matchobj.group(*0*)...
-
- 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?
Gruß, mawe
Ä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'
- 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:
raus kommt:
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)
erwartet hätte ich:0: a<b>
1: a
2: <b>
0: a
1: <b>
2: c
-
- 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
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