Reguläre Ausdrücke

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
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Hallo zusammen,

habe ein kleines Anfängerproblem mit einem regulären Ausdruck:

Ausdruck: [^<].*[^>]

String: "<Hallo zusammen hier ist stop>.....blablabla>>>"

Mein Problem ist, dass mit der oben aufgeführtem Ausdruck folgendes auslesen möchte:
"Hallo zusammen hier ist stop"

Komischerweise bleibt er beim ersten ">" nicht stehen und geht trotz der Anweisung ....[^>] weiter. Kann mir jemand sagen wieso???

Danke.

Samid
BlackJack

@samid: Weil '.*' versucht so viele Zeichen wie möglich zu matchen und beliebig viele Zeichen gefolgt von einem nicht-'>'-Zeichen geht dann bis zum letzten nicht-'>' in den Eingabedaten. Du möchtest vielleicht eher so etwas wie '<([^>]*)>' als Muster haben. Also ein '<' gefolgt von beliebig vielen Zeichen die nicht '>' sind, gefolgt von einem '>'. Und als Gruppe die Zeichen zwischen den '<', '>'.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Danke für die Antwort BlackJack,

das klappt schon mal gut, nur will ich die "<" und ">" auch ausschließen.

gruß
samid
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

samid hat geschrieben:das klappt schon mal gut, nur will ich die "<" und ">" auch ausschließen.
Setze passende Klammern um eine Gruppe zu definieren.

Code: Alles auswählen

r'<([^>]+)>'
Das match-Objekt liefert dir dann mit group(0) das komplette Ergebnis und mit group(1) den Inhalt der ersten Gruppe.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Und nur mit dem regulären Ausdruck ist es nicht möglich?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

samid hat geschrieben:Und nur mit dem regulären Ausdruck ist es nicht möglich?
Die Frage verstehe ich jetzt nicht. Das ist doch ein regulärer Ausdruck.

Code: Alles auswählen

>>> import re
>>> data = "<Hallo zusammen hier ist stop>.....blablabla>>>"
>>> matches = re.search(r'<([^>]+)>', data)
>>> print(matches.group(0))
<Hallo zusammen hier ist stop>
>>> print(matches.group(1))
Hallo zusammen hier ist stop
BlackJack

Theoretisch könnte man noch „lookbehind/lookahaead assertions” verwenden, die sind aber ein wenig exotischer und deshalb auch nicht in allen Dialekten von regulären Ausdrücken enthalten, und deshalb auch etwas verwirrend für viele Leser. Das wäre dann r'(?<=<)[^>]*(?=>)'. Würde ich aber nicht machen, weil unnötig komisch/umständlich.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kann es sein, dass du HTML parsen willst? Falls ja: Es gibt entsprechende Bibliotheken dafür, die man bevorzugt verwenden sollte, anstatt sich irgendwelche regulären Ausdrücke zusammen zu schustern.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Ja schon, aber wenn ich z.b diesen regulären Ausdruck auf der Internetseite RegExr.com ausprobiere dann schließt dieser Ausdruck auch die "<>" mit ein. Oder verstehe ich da was falsch?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

samid hat geschrieben:Ja schon, aber wenn ich z.b diesen regulären Ausdruck auf der Internetseite RegExr.com ausprobiere dann schließt dieser Ausdruck auch die "<>" mit ein. Oder verstehe ich da was falsch?
Auf der Seite steht zu diesem Ausdruck Folgendes:

Code: Alles auswählen

RegExp: /<([^>]+)>/g
pattern: <([^>]+)>
flags: g
1 capturing groups: 
   group 1: ([^>]+)
Selbst dort ist die Gruppe angegeben. Welches Problem hast du denn bitte konkret damit?
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Nee ich habe kein Problem damit, ich will das nur verstehen. Das heißt mit "()" kann ich meine gefilterten Strings groupieren und mir dann die Gruppe ausgeben lassen?
BlackJack

@samid: Das sagt zumindest die Dokumentation zu Match-Objekten. In der Python-Dokumentation gibt es ausserdem ein HOWTO zu regulären Ausdrücken: http://docs.python.org/2/howto/regex.html
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

samid hat geschrieben:Nee ich habe kein Problem damit, ich will das nur verstehen. Das heißt mit "()" kann ich meine gefilterten Strings groupieren und mir dann die Gruppe ausgeben lassen?
Ja. Jede öffnende Klammer beginnt eine neue Gruppe.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Na gut, dann bin ich in der Welt der Regex einbisschen weiter gekommen, danke für eure Antworten.
BlackJack

…ausser wenn sie es nicht tut. Ich zähle die Fälle jetzt mal nicht alle auf. Mein vorletzter Beitrag enthält zwei Beispiele. :-)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:…ausser wenn sie es nicht tut. Ich zähle die Fälle jetzt mal nicht alle auf. Mein vorletzter Beitrag enthält zwei Beispiele. :-)
Eine non-capturing group mit (?:...) wäre der einfachste Fall, aber da der OP sich ja offensichtlich nicht mal traut, das in Python auszuprobieren, wollte ich ihm wenigstens etwas Ermutigung geben.
Antworten