Seite 1 von 1
Regex - wdh. Elemente
Verfasst: Mittwoch 3. Februar 2010, 14:10
von da.dom
Hallo Zusammen,
ich habe ein kleines Problem mit Regex, da das ganze schwer zu beschreiben ist, hier mal ein kleines Beispiel:
Code: Alles auswählen
test="a=aaa a=bbb ende"
print re.findall("a=(.*?) ende",test)
Mein gwünschtes Ergebnis ist "bbb", also das Muster "a=" welches er VOR einem bestimmten anderen Muster (hier: "ende") findet.
Jemand einen guten Tipp?
Grüße
Dom
Verfasst: Mittwoch 3. Februar 2010, 15:25
von Leonidas
Verfasst: Mittwoch 3. Februar 2010, 16:14
von da.dom
Nicht so ganz, hier mal der eigentliche Zweck (ja ich weiss, regex und html - parsen

)
Code: Alles auswählen
html='<a href="link1.html">Link Text 1</a> | <a href="link-pg3442-1.html?PHPSESSID=5708116dd0bdf2c931d1b539c4ec4d98">weiter</a></p> </div> '
print re.findall("<a href=\"(\w*?)\">weiter",html)
Grüße
D
Verfasst: Mittwoch 3. Februar 2010, 16:42
von karolus
Verfasst: Mittwoch 3. Februar 2010, 16:54
von da.dom
Wenn du jetzt noch eine erläutern hinterher schießt, bin ich wunschlos glücklich
[^"]*
Da komme ich nicht ganz mit und verstehe die Dokumentation in dem Punkt auch nicht

und wenn wir schon mal einen regex experten hier haben, warum meine Idee nicht funktioniert hat, bei
"<a href="(\.*?)">weiter"
hätte ich erwartet das er '>weiter' sucht und dann rückwärst den minimalen "Weg" zum "...href =" geht, oder kann er diesen rückwärts weg nicht und matchts immer von links nach rechts?
(also suche ein "<a href" und gehe den minimalsten weg zum nächsten ">weiter" ?)
Grüße
D
Verfasst: Mittwoch 3. Februar 2010, 17:05
von /me
da.dom hat geschrieben:
[^"]*
Da komme ich nicht ganz mit und verstehe die Dokumentation in dem Punkt auch nicht

Die eckigen Klammern definieren eine Zeichenklasse. Abgefragt werden also alle Zeichen die innerhalb definiert sind. Jetzt ist das erste Zeichen allerdings ein
^. Das sagt wiederum, dass die folgenden Zeichen nicht vorkommen dürfen, alle anderen hingegen schon. Die folgenden Zeichen sind jetzt ", wobei der Backslash nur ein Escape-Zeichen ist und somit nur das Anführungszeichen übrig bleibt. Der Stern (*) hinter der eckigen Klammer steht für 0 bis beliebig viele Wiederholungen.
Dieser Teil definiert also eine beliebige Menge von Zeichen bis zum Auftreten eines " (doppelte Anführungsstriche).
Noch ein Hinweis zur Suche: Reguläre Ausdrücke sind im Normalfall gierig und nehmen so viel sie können.
Verfasst: Mittwoch 3. Februar 2010, 17:24
von BlackJack
Wenn man den Teilausdruck so isoliert betrachtet, dann muss man den '\' da natürlich rausnehmen, denn der gehört ja nicht zum regulären Ausdruck sondern wird von Python weginterpretiert. Wieso da eine in " eingefasste Zeichenkette benutzt wurde, statt einer in ' eingefasste, oder noch besser ein "raw"-Zeichenkettenliteral, ist mir ein Rätsel.