Seite 1 von 1
Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 14:45
von samid
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
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 14:52
von 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 '<', '>'.
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 14:57
von samid
Danke für die Antwort BlackJack,
das klappt schon mal gut, nur will ich die "<" und ">" auch ausschließen.
gruß
samid
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 14:59
von /me
samid hat geschrieben:das klappt schon mal gut, nur will ich die "<" und ">" auch ausschließen.
Setze passende Klammern um eine Gruppe zu definieren.
Das match-Objekt liefert dir dann mit
group(0) das komplette Ergebnis und mit group(1) den Inhalt der ersten Gruppe.
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 15:22
von samid
Und nur mit dem regulären Ausdruck ist es nicht möglich?
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 15:37
von /me
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
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 16:01
von 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.
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 16:03
von snafu
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.
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 17:01
von samid
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?
Re: Reguläre Ausdrücke
Verfasst: Dienstag 19. November 2013, 17:08
von /me
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?
Re: Reguläre Ausdrücke
Verfasst: Mittwoch 20. November 2013, 10:27
von samid
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?
Re: Reguläre Ausdrücke
Verfasst: Mittwoch 20. November 2013, 10:36
von 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
Re: Reguläre Ausdrücke
Verfasst: Mittwoch 20. November 2013, 11:06
von /me
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.
Re: Reguläre Ausdrücke
Verfasst: Mittwoch 20. November 2013, 12:25
von samid
Na gut, dann bin ich in der Welt der Regex einbisschen weiter gekommen, danke für eure Antworten.
Re: Reguläre Ausdrücke
Verfasst: Mittwoch 20. November 2013, 12:28
von 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.

Re: Reguläre Ausdrücke
Verfasst: Mittwoch 20. November 2013, 12:48
von /me
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.