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
was muss ich am regulären Ausdruck ändern, damit ich folgendes erhalte?
mfg
Twilo
Verfasst: Donnerstag 5. Juni 2008, 21:59
von audax
*?, +?, ??
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