Regular Expressions

Code-Stücke können hier veröffentlicht werden.
Antworten
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hallo Leute,

ich habe hier ein paar regular Expressions die vielleicht recht hilfreich sind

Code: Alles auswählen

RE_INT = "^[\+\-]?\d+$"
RE_FLOAT = "^([\+\-]?((\d+\.?\d*)|(\d*\.\d+)))(e|E[\+\-]?\d+)?$"
RE_NAME = "^[_a-zA-Z]+\w*$"
RE_INT sollte klar sein, erlaubt zusätzlich ein Vorzeichen.
RE_FLOAT erlaubt ein Vorzeichen und die Angabe eines Exponenten ".0" oder "0." sind auch erlaubt aber nicht nur ein "."!
RE_NAME erlaubt als ersten Zeichen nur _ und a-z bzw A-Z und als Folgezeichen alle "Wortzeichen" also auch Ziffern


Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Bei RE_INT würde ich führende Nullen verbieten.

Code: Alles auswählen

RE_INT = "^[+-]?[1-9]\d*$"
Bei RE_FLOAT eigentlich auch, ist aber wohl etwas aufwändiger.
Eher Kosmetik: Bei RE_NAME kannst Du das + weglassen.
Jan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

warum führende nullen verbieten, 0 ist auch ein int! 0.0 ist auch ein Float genauso wie 0. bei RE_NAME haste recht :)

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Dookie hat geschrieben:warum führende nullen verbieten, 0 ist auch ein int! 0.0 ist auch ein Float genauso wie 0.
Bei "077" würde ich eher eine Okalzahl ermuten (bei einem Literal wäre es das ja), aber ich sehe gerade, dass int() ohne 2. Parameter immer von Dezimalzahlen ausgeht, egal wie viele führende Nullen. Wenn ein 'schlauer' Anwender "077" eingibt, in der Hoffnung, dass das als Oktalzahl interpretiert wird, hat er natürlich Pech.

Zumindest wenn ich Anwendereingaben kontrollieren will, würde ich schon sowas wie "007" oder "00.4" als falsch erkennen wollen, weil der Anwender vielleicht "1007" oder "100.4" meinte und nur die "1" nicht richtig erwischt hat.
Naja, ist sicherlich abhängig vom Einsatz.
Jan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Voges,

ist eine Oktalzahl kein Int?
Desweiteren werden ints ja auch gerne verwendet um Objekte durchzunummerieren und um dann besser sortieren zu können oder auch wegen des Layouts verwende ich da gerne solche Bezeichner wie objekt_001, objekt_002 ...
Wenn würde ich bei der Benutzereingaben schon führende Nullen entfernen bzw gar nicht erst zulassen. Andererseits gibts ja auch die Möglichkeit bei Strings führende Nullen zu erzwingen.

Code: Alles auswählen

teststr = "%03d" % 12
test2 = "12".zfill(3)
Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Dookie hat geschrieben:ist eine Oktalzahl kein Int?
Klar, ebenso Hex-Zahlen, die aber Dein Regexp meist nicht als gültig erkennt.

Zumindest wenn es darum ginge, gültige Zahlen zur Basis 10 zu erkennen, würde ich führende Nullen als falsch erkennen wollen (außer natürlich die 0 selbst), wenns denn Anwendereingaben sind. Bei maschinell erzeugten String a la "objekt_002" ist das natürlich nicht nötig. Wie gesagt: Fallabhängig.

Jan
garz

RE_FLOAT = "^([\+\-]?((\d+\.?\d*)|(\d*\.\d+)))(e|E[\+\-]?\d+)?$"
klappt meiner meinung nach nicht ganz, jedenfalls wo ich es getestet habe... so sieht meine modifikation davon aus:

Code: Alles auswählen

[\+\-]?((\d+\.?\d*)|(\.\d+))([eE][+\-]?\d+)?
erstens braucht nach dem oder-strich der fall, dass zahlen vor dem komma stehen nicht mehr beachtet werden, da der schon in der klammer vor dem oder-strich steht und zweitens ist der oder-strich für die auswahl ob kleines e oder grosses e ungünstig, besser ist da einfach ein klasse anzugeben.

das regexp ist gestestet und funktioniert.[/quote]
Antworten