Regular Expressions Hilfe

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
tugayyolu
User
Beiträge: 4
Registriert: Sonntag 13. November 2011, 12:06

Hallo Leute,

ich brauche Hilfe für meine Hausafugabe.
Könnte jemand zu folgenden Regular Expressions(r1,r2,r3) einen passenden String s1,s2,s3 geben?

Code: Alles auswählen

r1 = r'^(\d{3})(x\1\w{2})\2$'
r2 = r'^(\w{3}-([cdefgah]{3}[3-8]{2}))-xfd-\1-\w{4}-\2$'
r3 = r'^((\d\w)(\s\W)\2)\3\1$'
mfg
Zuletzt geändert von tugayyolu am Samstag 19. November 2011, 13:32, insgesamt 2-mal geändert.
BlackJack

@tugayyolu: Warum sollten wir Deine Hausaufgaben machen!?

Edit: Die Antwort auf die Frage ist übrigens *Nein*, das *kann* niemand. Zumindest nicht für `s1` und `s2`. :-)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Für r1 und r2: Nein, kann ich nicht. Beide Regexe können gar nichts matchen, weil sie nur auf Strings passen, die ein Leerzeichen vor ihrem ersten Zeichen stehen haben, und solche Strings gibt es nicht.

Außerdem ist die zweite Zeile (mit r2) kein gültiges Python.

Für r3 hab ich eine Lösung, die ich dir gerne zeigen werde, sobald du mir zeigst, was du bereits probiert hast.

Gruß
Mick.
In specifications, Murphy's Law supersedes Ohm's.
tugayyolu
User
Beiträge: 4
Registriert: Sonntag 13. November 2011, 12:06

@pillmuncher

Hallo,
ich habe r1 und r2 ausgebessert. Ich habe falsch abgetipt.

meine lösug zu r3 wäre so:

(\d\w)-> 1a
(\s\W)-> (whitespace)2
r'^((\d\w)(\s\W)\2)\3\1$->(whitespace)21a(whitespace)21a


\2,\3,\1 diese Zahlen verwirren mich. Kannst du auch erklären was die zu beduten haben?

Gruß
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

http://docs.python.org/howto/regex.html

\n sind Referenzen auf die Gruppe n

Mehr Hilfe wirst du zu deiner Hausaufgabe hier wohl nicht bekommen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

tugayyolu hat geschrieben:@pillmuncher
meine lösug zu r3 wäre so:

(\d\w)-> 1a
(\s\W)-> (whitespace)2
r'^((\d\w)(\s\W)\2)\3\1$->(whitespace)21a(whitespace)21a

\2,\3,\1 diese Zahlen verwirren mich. Kannst du auch erklären was die zu beduten haben?
Das sind sog. back references. Damit kann man bereits "gefangene" Gruppen wiederholen. Gruppen werden definiert durch runde Klammern. \1 bezieht sich dann auf das, was durch die Gruppe, die durch die erste öffnende Klammer definiert wird, gematcht wurde. Etwa so:

Code: Alles auswählen

regex = r'(\w)\1'
print re.match(r'aa')
Hierbei gibt es einen Match von (\w) auf a, und von \1 auf das, was durch die Gruppe (\w) vorher gematcht wurde, also wieder a. Gruppen können geschachtelt auftreten:

Code: Alles auswählen

regex = r'(\w(\d))\2\1'
print re.match(r'a77a7')
Hierbei wird a7 durch Gruppe 1 == (\w(\d)) gematcht und 7 durch Gruppe 2 == (\d).

r3 in deinem Beispiel stellt sich also folgendermaßen dar:

Code: Alles auswählen

^  = Beginn des Strings
(  = Beginn der ersten Gruppe
(  = Beginn der zweiten Gruppe
\d = eine Ziffer
\w = ein Buchstabe
)  = Ende der zweiten Gruppe
(  = Beginn der dritten Gruppe
\s = ein Whitespace
\W = ein Nicht-Buchstabe
)  = Ende der dritten Gruppe
\2 = Rückbezug darauf, was durch die zweite Gruppe gematcht wurde
)  = Ende der ersten Gruppe
\3 = Rückbezug darauf, was durch die dritte Gruppe gematcht wurde
\1 = Rückbezug darauf, was durch die erste Gruppe gematcht wurde
$  = Ende des Strings
Damit sollte sich für r3 ein passender String konstruieren lassen.

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
tugayyolu
User
Beiträge: 4
Registriert: Sonntag 13. November 2011, 12:06

Hallo Mick,

erstmal danke für ausführliche Antwort.

ich habe deine Anweisung gefolgt und die 3 Strings konstruiert. Kannst du vielleicht kurz kontrollieren ob die Strings schon passen

Code: Alles auswählen


r1:
\d{3} =123
x\1\w{2}=x123ab
\2  =x123ab
+
________________
123x123abx123ab  


r2:
\w{3}-  =abc-
[cdefgah]{3}[3-8]{2}-xfd-  =gah45-xfd-
\1-  =abc-gah45-xfd--
\w{4}- =bing-
\2  =gah45
+
_______________________________________
abc-gah24-xfd-abc-gah45-xfd--bing-gah45


r3:
(\d\w)  =1a
(\s\w) = _
\2  =1a
\3  =1a _
\1  =1a
+
_____________________
1a _1a _1a _1a

Gruß
BlackJack

@tugayyolu: Warum kontrollierst Du das nicht einfach selbst!? Das kann man doch leicht ausprobieren.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Hallo tugayyolu.

r1 und r3 stimmen. r2 dagegen leider nicht.

Code: Alles auswählen

r2:
\w{3}-  =abc-
[cdefgah]{3}[3-8]{2}-xfd-  =gah45-xfd-
\1-  =abc-gah45-xfd--
\w{4}- =bing-
\2  =gah45
+
_______________________________________
abc-gah24-xfd-abc-gah45-xfd--bing-gah45
       ^^ Tippfehler.
Desweiteren gehört -xfd- zu keiner Gruppe und kann deswegen auch nicht durch eine back reference gematcht werden. Versuch mal das:

Code: Alles auswählen

(
    \w{3}                  # abc
    -                      # -
    ([cdefgah]{3}[3-8]{2}) # gah45
)                          # abc-gah45
-xfd-                      # -xfd-
\1                         # abc-gah45
-\w{4}-                    # bing
\2                         # gah45
Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
Antworten