Hallo zusammen,
ich beschäftige mich gerade mir RegEx,
dabei stieß ich auf den Teil *?
Ich hab ihn im RegEx: <(.)*?> gesehen.
Was macht das genau? Also wie beschreibt man das am besten?
Ich hab da keine Ahnung :K
Ich weis das * erlaubt, dass das vorherige Zeichen beliebig oft hintereinander vorkommen darf
und das ? erlaubt, das das vorherige Zeichen entweder keinmal oder einmal vorkommen darf.
Bezieht sich im Falle *? das ? auf den * oder auf das Zeichen VOR dem * ?
Könnt ihr mir weiterhelfen?
Grüße JohannesGolf
RegEx Hilfe bei "*?"
-
- User
- Beiträge: 34
- Registriert: Montag 10. März 2014, 09:27
Zuletzt geändert von JohannesGolf am Mittwoch 3. September 2014, 10:11, insgesamt 1-mal geändert.
@JohannesGolf: Das '?' bezieht sich auf den '*' und bedeutet an der Stelle etwas anderes als Du annimmst. Schau doch einfach mal in die Dokumentation zum `re`-Modul wo '*?', '+?', und '??' erklärt werden: https://docs.python.org/2/library/re.html
@JohannesGolf: *? ist eine besondere Form von *. Während * den längsten möglichen Substring sucht, so dass das Pattern noch passt, sucht *? den kürzesten.
Code: Alles auswählen
>>> import re
>>> text='"Wieviel Uhr ist es?" fragt Peter. "9 Uhr" sagt Hans'
>>> re.search('".*"', text).group(0)
'"Wieviel Uhr ist es?" fragt Peter. "9 Uhr"'
>>> re.search('".*?"', text).group(0)
'"Wieviel Uhr ist es?"'
-
- User
- Beiträge: 34
- Registriert: Montag 10. März 2014, 09:27
Danke. Das hat gut weiter geholfen.BlackJack hat geschrieben:@JohannesGolf: Das '?' bezieht sich auf den '*' und bedeutet an der Stelle etwas anderes als Du annimmst. Schau doch einfach mal in die Dokumentation zum `re`-Modul wo '*?', '+?', und '??' erklärt werden: https://docs.python.org/2/library/re.html
Es geht hier um das Stichwort "greedy" vs "non-greedy", welches du auch in anderen RE Implementierungen anfindest.
String: <Hallo Welt> wie geht es dir?>
Regex: <(.)*>
Match: <Hallo Welt> wie geht es dir?>
\1: Hallo Welt> wie geht es dir?
Das wäre die "greedy" Version vom *.
Und nun das non-greedy:
String: <Hallo Welt> wie geht es dir?>
Regex: <(.)*?>
Match: <Hallo Welt>
\1: Hallo Welt
In anderen Worten... stell dir *? hier so vor, als wenn die RE so gelautet hätte: <([^>])*>
Zu deutsch: genau ein kleiner-gleich, beliebig viele nicht-größer-gleich-Zeichen, genau ein größer-gleich
Hoffe das war verständlich.
String: <Hallo Welt> wie geht es dir?>
Regex: <(.)*>
Match: <Hallo Welt> wie geht es dir?>
\1: Hallo Welt> wie geht es dir?
Das wäre die "greedy" Version vom *.
Und nun das non-greedy:
String: <Hallo Welt> wie geht es dir?>
Regex: <(.)*?>
Match: <Hallo Welt>
\1: Hallo Welt
In anderen Worten... stell dir *? hier so vor, als wenn die RE so gelautet hätte: <([^>])*>
Zu deutsch: genau ein kleiner-gleich, beliebig viele nicht-größer-gleich-Zeichen, genau ein größer-gleich
Hoffe das war verständlich.