Seite 1 von 1

RegEx Hilfe bei "*?"

Verfasst: Mittwoch 3. September 2014, 10:06
von JohannesGolf
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

Re: RegEx Hilfe bei "*?"

Verfasst: Mittwoch 3. September 2014, 10:10
von 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

Re: RegEx Hilfe bei "*?"

Verfasst: Mittwoch 3. September 2014, 10:12
von Sirius3
@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?"'

Re: RegEx Hilfe bei "*?"

Verfasst: Mittwoch 3. September 2014, 10:46
von JohannesGolf
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.

Re: RegEx Hilfe bei "*?"

Verfasst: Donnerstag 4. September 2014, 12:08
von akis.kapo
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.