Regex {min,max} quantifier sind nicht greedy

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
jb300180
User
Beiträge: 2
Registriert: Freitag 9. März 2012, 16:51

die Regex {min,max} quantifier sind nicht greedy obwohl sie es sein sollten
im Beispiel gibt match "23456" aus - also reluctant/non-greedy

die Doku sagt {min,max} sei greedy während {min,max}? non-greedy sei
http://docs.python.org/library/re.html# ... ion-syntax

in diesem Beispiel funktioniert das leider nicht:

Code: Alles auswählen

import re
str="a string with numbers 123456 for regex"

c56 = re.compile(r".*(\d{5,6}).*")
print ("{5,6} is supposed 2 b greedy", c56.match(str).group(1))

c6 = re.compile(r".*(\d{6}).*")
print (c6.match(str).group(1))
getestet mit python 2.5.4. und 3.2.2.

Habe ich vielleicht etwas falsch gemacht?
Handelt es sich um einen Bug?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Ich denke, dass das erste „.*“ die eins „tilgt“, du müsstest also statt „allem“ (.) nur „nicht-zahlen“ matchen oder dem „.*“ ein Fragezeichen nachstellen, damit das Muster „.*“ als „greedy“ aufgefasst wird.

So funktioniert es:

Code: Alles auswählen

In [1]: TEXT = "a string with numbers 123456 for regex" # eigentlich sind es "digits"

In [10]: re.findall(r"\d{5,6}", TEXT)
Out[10]: ['123456']

In [15]: re.match(r"\D*(\d{5,6})\D*", TEXT).groups() # ich finde die erste Variante aber besser ...
Out[15]: ('123456',)
Zuletzt geändert von nomnom am Freitag 9. März 2012, 18:06, insgesamt 2-mal geändert.
jb300180
User
Beiträge: 2
Registriert: Freitag 9. März 2012, 16:51

Exzellent!
du hast recht vielen Dank regex-champ :wink:
Antworten