Regex - wdh. Elemente

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
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Etwa so?

Code: Alles auswählen

print re.findall("a=(\w*?) ende",test) 
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

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
karolus
User
Beiträge: 141
Registriert: Samstag 22. August 2009, 22:34

Hallo

Code: Alles auswählen

print re.findall("<a href=\"([^\"]*)\">weiter",html)
Gruß Karo
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

karolus hat geschrieben:

Code: Alles auswählen

print re.findall("<a href="([^"]*)">weiter",html)
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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
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.
Antworten