reguläre ausdrücke

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
Gast

puah he!!!

die machen mich nochmal fertig :D :D

folgendes muss geprüft werden:

am beginn eines strings muss eine menge von buchstaben stehen, es darf ein leerzeichen folgen, und anschliessend eine zahl und dann wiederum ein buchstabe.

also z.b.

hanserstrasse 75a

ich krieg es nicht hin, natürlich müssen auch umlaute erlaubt sein, die aber nur einmal vorkommen dürfen.

z.b.
gänsestrasse 75b

aber natürlich nicht am schluss

vielen dank im voraus für eure hilfe
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

rolgal hat geschrieben:natürlich müssen auch umlaute erlaubt sein, die aber nur einmal vorkommen dürfen.
Hi. Ist das Pflicht (ich meine das mit dem nur einmal)? Wenn ja kannst du das ja über eine Nachprüfung realisieren (z.B. mit der Methode count), aber im re würde ich das rauslassen. Außerdem: ist vorgeschrieben, dass genau 1 Leerzeichen folgt, oder kann auch keins oder mehrere Folgen? Ich interpretier das jetzt mal ein kann eins kommen, muss aber nicht.

Sodale, so schlimm wars doch gar nicht, hier dein re: :wink:

Code: Alles auswählen

regex=re.compile("[a-z\xfc\xf4\xf6]+? ?\d+?[a-z]?",re.I)
Falls noch mehr Buchstaben erlaubt sein sollen (Beispiel "ß") musst du die natürlich noch mir in die eckigen Klammern schreiben.
Gast

hi milan!

dein ausdruck ist schon ziemlich gut, aber lässt noch adressen wie diese gelten:
höttingerau 72abzt 7896

sowas gibt es wohl nicht denke ich.

insgesamt ist es egal ob der user höttingerau72 oder höttingerau 72 eingibt. das spielt für mich in der bestätigungsmail keine rolle! wenn es 2 leerzeichen zwischen strassse und strassennummer sind, ist es auch wurscht.

mfg

roland
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Gut, da hast du Recht, wenn man ihn mit search oder findall einsetzt. Ich hab in dem Fall regex.match genommen, aber wennn du es beliebig haben willst, müssen wir wohl noch definieren, dass dies der komplette String ist:

Code: Alles auswählen

regex=re.compile("^[a-z\xfc\xf4\xf6]+? ?\d+?[a-z]?$",re.I)
Milan
Gast

mann milan!

verbeuge mich in ehrfurcht, scheint jetzt ja perfekt zu sein. ich habe dazu noch ein paar fragen:

Code: Alles auswählen

regex=re.compile("^[a-z\xfc\xf4\xf6]+? ?\d+?[a-z]?$",re.I)

wenn ich versuch das zu lesen:
am anfang müssen zeichen aus einer menge a-z, xfc, xf4, xf6 (welcher steht da für welchen umlaut eigentlich?) stehen. das + steht wohl für einmalig oder mehrmal und bezieht sich auf a-z. das ? einmal oder keinmal auf einen der folgenden umlaute. richtig?

mfg

rolgal
Gast

hi nochmal!

irgendwas ist noch faul :?:

hier bekomme ich true zurück:
öüllinger 75t

hier aber richtigerweise false:
äüllinger 75t

ich sags ja, da denk ich, ich habe es verstanden bez. reg. ausdrücke, und dann stellt sich heraus, ich habe es doch nicht geschnallt :roll:

mfg

rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi rolgal,

welcher code für welches zeichen ist kannst Du mit chr rausfinden.

Code: Alles auswählen

>>> print chr(0xfc)
ü
mit hex und ord kannst Du den Code rausfinden.

Code: Alles auswählen

>>> print hex(ord("ü"))
0xfc
Achtung, das gilt aber nur für den gerade eingestellten Zeichensatz!
Der Code für ä ist 0xe4 nicht 0xf4, daher der Fehler.


Gruß

Dookie
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Ja, da hab ich beim abschreiben geschusselt. Python mag ja keine Sonderzeichen (ohne coding im IDLE, wobei ich aber zu faul bin, das einzutragen :wink:), deswegen hab ich hier Escapesequenzen genommen. Wenn man das ganze mit einem anderem Editor einträgt geht es natürlich auch ohne die Sequenz.
rogal hat geschrieben:das + steht wohl für einmalig oder mehrmal und bezieht sich auf a-z. das ? einmal oder keinmal auf einen der folgenden umlaute. richtig?
Leider falsch. Das "+?" zählt als ein Zeichen. Dabei gilt folgendes: das + heißt ein- oder mehrmaliges vorkommen von allen Sachen im der Klammer. Das ? sagt dem + aber, es soll trotzdem so wenig wie möglich versuchen mitzunehmen (wäre hier vielleicht unnötig, aber ich habs mir so angewöhnt, weil ich meine RE's meist mit Gruppen spicke und da ist das ganz nützlich). Dazu ein Auszug aus der Docu, der dir das vielleicht verdeutlicht:
Docu hat geschrieben:*?, +?, ??
The "*", "+", and "?" qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn't desired; if the RE <.*> is matched against '<H1>title</H1>', it will match the entire string, and not just '<H1>'. Adding "?" after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using .*? in the previous expression will match only '<H1>'.
Es können also nach wie vor beliebig viele Umlaute im String enthalten sein, was du dann wie oben gesagt nachprüfen müsstest.

hth, Milan
Gast

hallo dookie und milan!

danke für die antworten! ich blicke nach wie vor net ganz durch.

@milan:
Hi. Ja, da hab ich beim abschreiben geschusselt. Python mag ja keine Sonderzeichen (ohne coding im IDLE, wobei ich aber zu faul bin, das einzutragen ), deswegen hab ich hier Escapesequenzen genommen. Wenn man das ganze mit einem anderem Editor einträgt geht es natürlich auch ohne die Sequenz.
:?: :?: :?:

wo hast du für was escapesequenzen genommen und was soll das sein :D :D

@dookie:
nützlicher tipp, wobei: woher soll ich wissen, dass statt 0xfc eben xfc also ohne die 0 vorweg einzustellen ist?

@milan:
grundsätzlich steht doch + und ? für sich allein was ich meinte? woher weisst du dass sie zusammen eine andere bedeutung, bzw. ein einzelnes zeichen darstellen?

mfg

rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi rolgal,

Escape Sequenzen beginnen mit einem Backslash \ also z.B. \xfc ist eine Escapesequence, dabei bedeutet das x nach dem Backslash, daß danach ein zweistelliger Hexadezimalcode folgt.

In vielen Programmiersprachen ist es üblich Integerwerte, die an eine Variable zugewiesen, oder an eine Funktion übergeben werden, und die im Hexadezimalcode geschreiben sind, mit dem Präfix 0x zu kennzeichnen. In Strings werden Sonderzeichen die als Escapesequence im Hexadezimalcode eingefügt werden eben mit "\x" als Präfix gekennzeichnet.

Wenn in einer Regualarexpression ein qualifier "*", "+" und "?" nicht von einem ? gefolgt werden, wird alles was im String zu dem Ausdruck davor passt mit übernommen. Folgt ein ? so wird so wenig wie Möglich genommen. Bei dem Beispiel aus der Docu:

Code: Alles auswählen

>>> re.findall("<.*>", "<H1>title</H1>")
Out[37]: ['<H1>title</H1>']
 
>>> re.findall("<.*?>", "<H1>title</H1>")
Out[38]: ['<H1>', '</H1>']
 
>>> re.findall("<.*>", "<H1>title</H1")
Out[39]: ['<H1>']
Gruß

Dookie
Gast

hi dookie!

danke für deine erklärung! wenn ich sage ich habe es restlos geschnallt, wäre es wohl der ausdruck meines wunschdenkens, aber es dämmert, auf jeden fall, das ist ja schon was :D

bis bald

rolgal
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Na dann bist du ja bereit für die nächste Portion nachdenkliches :wink: . Mir ist nämlich eingefallen, dass die Bedingung von nur einem Umlaut auch nicht schwer ist:

Code: Alles auswählen

regex=re.compile("^(?:[a-z]*[\xfc\xe4\xf6]?[a-z]+|[a-z]+[\xfc\xe4\xf6]?[a-z]*) ?\d+?[a-z]?$",re.I)
Schonmal vorneweg :wink: : das "(?:" läutet eine Gruppe von Zeichen ein, die zwar zusammengehöhren, aber nicht für den Ausdruck als Gruppe gelten sollen und der "|" sagt entweder das links von mir, oder das rechts von mir muss passen.

Viel Spaß, Milan
Gast

hallo milan!

danke für deine denkaufgabe :D :D

das problem das ich noch habe mit den ausdrücken: wenn ich einen vor mir habe, dann kann ich ihn meistens schon verstehen, gut manchmal interpretier ich aus unwissen etwas falsch (vgl. + ?)
,aber es ist dann doch nachvollziehbar was da steht. nur wenn ich selber einen schreiben soll, dann merke dass es eben doch net sitzt, oder eben wirklich restlos verstanden habe.

ihr zwei seid auf jeden fall eine große hilfe!

bis bald

rolgal
Antworten