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
Reguläre Ausdrücke
@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 '<', '>'.
Setze passende Klammern um eine Gruppe zu definieren.samid hat geschrieben:das klappt schon mal gut, nur will ich die "<" und ">" auch ausschließen.
Code: Alles auswählen
r'<([^>]+)>'
Die Frage verstehe ich jetzt nicht. Das ist doch ein regulärer Ausdruck.samid hat geschrieben:Und nur mit dem regulären Ausdruck ist es nicht möglich?
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
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.
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.
Auf der Seite steht zu diesem Ausdruck Folgendes: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?
Code: Alles auswählen
RegExp: /<([^>]+)>/g
pattern: <([^>]+)>
flags: g
1 capturing groups:
group 1: ([^>]+)
@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
Ja. Jede öffnende Klammer beginnt eine neue Gruppe.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?
…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.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.