regulärer Ausdruck erfasst zu wenig

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.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

regulärer Ausdruck erfasst zu wenig

Beitragvon Twilo » Donnerstag 5. Juni 2008, 21:38

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Donnerstag 5. Juni 2008, 21:59

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Beitragvon Twilo » Donnerstag 5. Juni 2008, 22:25

Hallo,

danke, jetzt funktioniert es.

mfg
Twilo
BlackJack

Beitragvon BlackJack » Freitag 6. Juni 2008, 07:22

Man könnte den Ausdruck noch ein wenig kürzer schreiben: r'.*?((\d+)(_\d+){7})'
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Freitag 6. Juni 2008, 08:28

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
BlackJack

Beitragvon BlackJack » Freitag 6. Juni 2008, 10:44

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.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Beitragvon keppla » Freitag 6. Juni 2008, 11:05

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!
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Beitragvon Twilo » Freitag 6. Juni 2008, 14:26

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]