Seite 1 von 1

regulärer Ausdruck erfasst zu wenig

Verfasst: Donnerstag 5. Juni 2008, 21:38
von Twilo
Hallo,

mein regulärer Ausdruck

Code: Alles auswählen

matchstr = re.compile(r'·*((\d+)_\d+_\d+_\d+_\d+_\d+_\d+_\d+).*')
findet zu wenig.

Code: Alles auswählen

import re
matchstr = re.compile(r'.*((\d+)_\d+_\d+_\d+_\d+_\d+_\d+_\d+).*')
test = "a240_2716_2341_2342_965_157_1204_2285a"
match = matchstr.match(test)
if match:
    print match.group(1)
    print match.group(2)
gibt folgendes zurück

Code: Alles auswählen

0_2716_2341_2342_965_157_1204_2285
0
was muss ich am regulären Ausdruck ändern, damit ich folgendes erhalte?

Code: Alles auswählen

240_2716_2341_2342_965_157_1204_2285
240
mfg
Twilo

Verfasst: Donnerstag 5. Juni 2008, 21:59
von audax

Code: Alles auswählen

r'.*?((\d+)_\d+_\d+_\d+_\d+_\d+_\d+_\d+).*'
*?, +?, ??
The "*", "+", and "?" qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn't desired; if the RE <.*> is matched against '<H1>title</H1>', it will match the entire string, and not just '<H1>'. Adding "?" after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using .*? in the previous expression will match only '<H1>'.
Quelle

Verfasst: Donnerstag 5. Juni 2008, 22:25
von Twilo
Hallo,

danke, jetzt funktioniert es.

mfg
Twilo

Verfasst: Freitag 6. Juni 2008, 07:22
von BlackJack
Man könnte den Ausdruck noch ein wenig kürzer schreiben: r'.*?((\d+)(_\d+){7})'

Verfasst: Freitag 6. Juni 2008, 08:28
von EnTeQuAk
Wobei ich mal gelesen habe das man aus Performance-Gründen Regular-Expressions ausschreiben sollte (sofern möglich). In wieweit das zutrifft weiß ich nicht, kann sein das das nur für C# zutrifft glaub da hab ich das her :)
Und das sollte wohl auch eher ein vernachlässigbarer Vorteil sein...

(Ne Info hierüber wär aber nicht schlecht)

MfG EnTeQuAk

Verfasst: Freitag 6. Juni 2008, 10:44
von BlackJack
Da gilt der übliche Rat: Nachmessen und nicht auf irgendwelche allgemeingültigen Tipps hören. Ich find's so "lesbarer" weil man sehr schnell sieht, dass es 8 Zahlen-"Gruppen" sind, ohne zählen zu müssen.

Verfasst: Freitag 6. Juni 2008, 11:05
von keppla
EnTeQuAk hat geschrieben:Wobei ich mal gelesen habe das man aus Performance-Gründen Regular-Expressions ausschreiben sollte (sofern möglich). In wieweit das zutrifft weiß ich nicht, kann sein das das nur für C# zutrifft glaub da hab ich das her :)
Ich weis es auch nicht genau, aber, da dein String eh compliliert wird halte ich das für sehr unwahrscheinlich.
Und selbst wenn, was ist wahrscheinlicher, dass du mal vor der Situation stehst, dass dein Programm genau diese Nanosekunde Geschwindigkeit braucht, oder, dass du vor einem Bug stehst, der mit einem kaputten regulären Ausdruck zusammenhängt?

Stoppt cargo cult programming in den Anfängen!

Verfasst: Freitag 6. Juni 2008, 14:26
von Twilo
Hallo,
BlackJack hat geschrieben:Man könnte den Ausdruck noch ein wenig kürzer schreiben: r'.*?((\d+)(_\d+){7})'
ok, macht die ganze Sache etwas übersichtlicher :)

mfg
Twilo