RegEx Hilfe bei "*?"

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
JohannesGolf
User
Beiträge: 34
Registriert: Montag 10. März 2014, 09:27

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
Zuletzt geändert von JohannesGolf am Mittwoch 3. September 2014, 10:11, insgesamt 1-mal geändert.
BlackJack

@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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?"'
JohannesGolf
User
Beiträge: 34
Registriert: Montag 10. März 2014, 09:27

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
Danke. Das hat gut weiter geholfen.
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

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