
Hallo Liste, ich habe ein Programm in dem ich prüfen will ob ein übergebener Paramter eine IP ist, ich habe das "Problem" zwar gelöst, aber dennoch frage ich mich warum die RE: "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" Nicht Funktioniert, aber die RE: "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" funktioniert einwandrei! Gestestet habe ich das mit folgendem Miniprogramm: import re ipre = re.compile("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}") ipre.match("127.0.0.1") <SRE_Match object at 0x81311b8>#, das ist ja nicht weiter schlimm... #aber: ipre.match("127.0.0.1156489489") <SRE_Match object at 0x8110838># Ist schon nichtmehr so toll, weil die #IP ja ungültig ist :-( Mit der zweiten RE von oben funktioniert es aber, spielt das "erfassen" von Stringanfang und Stringende wirklich eine so große Rolle? mfg Betz Stefan -- Das Telefonnetz... Unendliche Weiten... Dies sind die Abenteuer eines genervten Internet-Surfers... Weit von zu Hause entfernt stößt er in Bereiche des Systems vor, die vorher noch niemand gesehen hat... _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Sat, 3 Jan 2004 14:55:20 +0100 Schrieb "Stefan J. Betz" <stefan_betz@gmx.net>:
Hallo Liste,
ich habe ein Programm in dem ich prüfen will ob ein übergebener Paramter eine IP ist, ich habe das "Problem" zwar gelöst, aber dennoch frage ich mich warum die RE: "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
Nicht Funktioniert, aber die RE: "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"
funktioniert einwandrei!
Gestestet habe ich das mit folgendem Miniprogramm: import re
ipre = re.compile("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}") ipre.match("127.0.0.1") <SRE_Match object at 0x81311b8>#, das ist ja nicht weiter schlimm... #aber: ipre.match("127.0.0.1156489489") <SRE_Match object at 0x8110838># Ist schon nichtmehr so toll, weil die #IP ja ungültig ist :-(
Mit der zweiten RE von oben funktioniert es aber, spielt das "erfassen" von Stringanfang und Stringende wirklich eine so große Rolle?
mfg Betz Stefan --
Hallo Stefan, Im ersten Fall wird nur getestet ob das Muster innerhalb des Strings vorkommt, und das tut es auch in "127.0.0.1156489489", da es egal ist ob nochetwas davor oder dahinter steht. Wenn Du dir das Ergebnis zurückgeben lässt, erhältst Du "127.0.0.115". Nur wenn Stringanfang und Stringende markiert werden, wird der ganze Strin mit dem Muster verglichen, da ja beim 2. Regex Stringanfang und Stringende mit zum Muster gehören. Gruß Fritz _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Sat, Jan 03, 2004 um 15:20:59 CET, fritz cizmarov schrieb:
Hallo Stefan,
Im ersten Fall wird nur getestet ob das Muster innerhalb des Strings vorkommt, und das tut es auch in "127.0.0.1156489489", da es egal ist ob nochetwas davor oder dahinter steht. Wenn Du dir das Ergebnis zurückgeben lässt, erhältst Du "127.0.0.115". Nur wenn Stringanfang und Stringende markiert werden, wird der ganze Strin mit dem Muster verglichen, da ja beim 2. Regex Stringanfang und Stringende mit zum Muster gehören.
Gruß
Fritz
Vielen Dank, im nachhinein wirkt das sogar irgendwie logisch :-) mfg Betz Stefan -- Das Telefonnetz... Unendliche Weiten... Dies sind die Abenteuer eines genervten Internet-Surfers... Weit von zu Hause entfernt stößt er in Bereiche des Systems vor, die vorher noch niemand gesehen hat... _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hi! Stefan J. Betz schrieb:
aber dennoch frage ich mich warum die RE: "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" nicht funktioniert
aber die RE: "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" funktioniert einwandrei!
spielt das "erfassen" von Stringanfang und Stringende wirklich eine so große Rolle?
Oh ja! Mit dem ersten Ausdruck sagst du ja: "dahinter darf kommen, was will"; also ist "123.234.123.4365643756439876536549" gültig, weil bis ."436" der reguläre Ausdruck abgearbeitet ist und der Rest somit egal; mit dem "$" forderst du: "wenn der Ausruck diese Stelle erreicht hat, erwarte ich das Zeilenende". Das "^" kannst du weglassen, da du .match und nicht .search verwendest (lies ggf. dir den Unterschied zwischen den beiden Methoden und das Zusammenspiel mit "^" im Python-Manual durch). Du kannst natürlich auch die IP extrahieren: ipreg = re.compile(R'([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})') ipmatch = ipreg.match(...) print ipmatch.group(1) (ausprobieren!) Was sinniger ist, hängt von Gesamtzusammenhang ab. Dir sollte aber klar sein, dass bei beiden Ausdrücken so etwas wie "999.999.999.000" eine gültige IP ist.
mfg ffh
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo Stefan, On Sat, 2004-01-03 14:55:20 +0100, Stefan J. Betz wrote:
ich habe ein Programm in dem ich prüfen will ob ein übergebener Paramter eine IP ist, ich habe das "Problem" zwar gelöst, aber dennoch frage ich mich warum die RE: "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
Nicht Funktioniert, aber die RE: "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"
funktioniert einwandrei! [...]
Fritz hat ja schon etwas dazu geschrieben, warum der eine reguläre Ausdruck funktioniert und der andere nicht. Ich habe noch eine Anmerkung. Der "richtige" reguläre Ausdruck lässt immer noch unsinnige IPs zu, z. B. 192.168.327.999 (die einzelnen Bestandteile dürfen nur zwischen 0 und 255 liegen). Evtl. reicht dir eine "Vorauswahl" schon, aber wenn du es genauer haben willst, wird der reguläre Ausdruck schon komplizierter. Ich habe sowas mal hinbekommen, aber fand es dann so unübersichtlich, dass ich mir vorgenommen habe, das nie zu verwenden. ;-) [Ich hab's eben nochmal ausprobiert; eine Gruppe (von 4) sollte sich mit re.compile(r"^[1-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]$") indentifizieren lassen, aber wie gesagt, ist ziemlich unübersichtlich (selbst, wenn es sich noch etwas "komprimieren" lässt, oder sogar dann erst recht).] Du kannst zur Kontrolle der IP aber auch ganz ohne Regex auskommen (ungetesteter Code): parts = ip.split('.') try: numbers = [int(part) for part in parts if 0 <= int(part) <= 255] if len(numbers) != 4: raise ... except ValueError: raise ... Eine andere Möglichkeit ist, den Regex mit Gruppen zu verwenden und die einzelnen Bestandteile zu untersuchen: match = re.search(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ip) if match is None: raise ... numbers = [int(part) for part in match.groups() if 0 <= int(part) <= 255] if len(numbers) != 4: raise ... Das ist nur eine Zeile weniger. Noch ein Hinweis, falls du IPv6 einbeziehen willst: Das obige gilt für IPv4; IPv6-IPs sind wiederum anders aufgebaut. Stefan _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Sat, Jan 03, 2004 um 17:01:56 CET, Stefan Schwarzer schrieb:
Ich habe noch eine Anmerkung. Der "richtige" reguläre Ausdruck lässt immer noch unsinnige IPs zu, z. B. 192.168.327.999 (die einzelnen Bestandteile dürfen nur zwischen 0 und 255 liegen).
Das ist mir klar, das ist allerdings ein Problem das mir auch erst jetzt eingefallen ist :-(
Du kannst zur Kontrolle der IP aber auch ganz ohne Regex auskommen (ungetesteter Code):
parts = ip.split('.') try: numbers = [int(part) for part in parts if 0 <= int(part) <= 255] if len(numbers) != 4: raise ... except ValueError: raise ...
Sowas in der Art wäre auch ne Lösung, vor allem weil die Funktion ja eh nur 1x aufgerufen wird (beim Programmstart), von daher wäre dieses Konstrukt sicherlich sinnvoll...
Eine andere Möglichkeit ist, den Regex mit Gruppen zu verwenden und die einzelnen Bestandteile zu untersuchen:
Ich erwarte eigentlich von der Funktion nur das sie mir sagt ob der übertragene String ne IP ist, mehr net, mit der obigen Funktion kann ich sie dann sogar noch einigermaßen auf gültigkeit Prüfen lassen...
Noch ein Hinweis, falls du IPv6 einbeziehen willst: Das obige gilt für IPv4; IPv6-IPs sind wiederum anders aufgebaut.
Das ist mir klar, ich verwenden zwar kein IPv6 weil ich nicht so recht den weis wie das so richtig Funktioniert (ich hasse Technik die ich nicht verstehe, also immer her mit ein paar netten Deutschen Linux+IPv6 URL's) mfg Betz Stefan PS: Schon interresant zu erfahren wie verschiedene Leute an Probleme herangehen würden, ich hätte da einfach mein RE genommen und gut ist, aber es geht halt IMMER auch anders... -- Das Telefonnetz... Unendliche Weiten... Dies sind die Abenteuer eines genervten Internet-Surfers... Weit von zu Hause entfernt stößt er in Bereiche des Systems vor, die vorher noch niemand gesehen hat... _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

"Stefan J. Betz" schrieb:
Am Sat, Jan 03, 2004 um 17:01:56 CET, Stefan Schwarzer schrieb:
Ich habe noch eine Anmerkung. Der "richtige" reguläre Ausdruck lässt immer noch unsinnige IPs zu, z. B. 192.168.327.999 (die einzelnen Bestandteile dürfen nur zwischen 0 und 255 liegen).
Das ist mir klar, das ist allerdings ein Problem das mir auch erst jetzt eingefallen ist :-(
...
Sowas in der Art wäre auch ne Lösung, vor allem weil die Funktion ja eh nur 1x aufgerufen wird (beim Programmstart), von daher wäre dieses Konstrukt sicherlich sinnvoll...
Eine andere Möglichkeit ist, den Regex mit Gruppen zu verwenden und die einzelnen Bestandteile zu untersuchen:
Ich erwarte eigentlich von der Funktion nur das sie mir sagt ob der übertragene String ne IP ist, mehr net, mit der obigen Funktion kann ich sie dann sogar noch einigermaßen auf gültigkeit Prüfen lassen...
Wenn es nur einmal beim Programmstart aufgerufen wird (als Kommandozeilenparameter übergeben?), fällt mir noch die Variante ein, aus dem Modul socket die Funktion gethostbyname(hostname) zu benutzen. Die sollte bei ungültiger IP-Adresse eine Exception liefern (und als Nebeneffekt auch normale Rechnernamen akzeptieren.) http://www.python.org/doc/current/lib/module-socket.html MfG Rene Liebscher _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Am Sat, Jan 03, 2004 um 17:01:56 CET, Stefan Schwarzer schrieb:
Ich habe noch eine Anmerkung. Der "richtige" reguläre Ausdruck lässt immer noch unsinnige IPs zu, z. B. 192.168.327.999 (die einzelnen Bestandteile dürfen nur zwischen 0 und 255 liegen).
Das ist mir klar, das ist allerdings ein Problem das mir auch erst jetzt eingefallen ist :-(
Du kannst zur Kontrolle der IP aber auch ganz ohne Regex auskommen (ungetesteter Code):
parts = ip.split('.') try: numbers = [int(part) for part in parts if 0 <= int(part) <= 255] if len(numbers) != 4: raise ... except ValueError: raise ...
Sowas in der Art wäre auch ne Lösung, vor allem weil die Funktion ja eh nur 1x aufgerufen wird (beim Programmstart), von daher wäre dieses Konstrukt sicherlich sinnvoll...
Eine andere Möglichkeit ist, den Regex mit Gruppen zu verwenden und die einzelnen Bestandteile zu untersuchen:
Ich erwarte eigentlich von der Funktion nur das sie mir sagt ob der übertragene String ne IP ist, mehr net, mit der obigen Funktion kann ich sie dann sogar noch einigermaßen auf gültigkeit Prüfen lassen...
Noch ein Hinweis, falls du IPv6 einbeziehen willst: Das obige gilt für IPv4; IPv6-IPs sind wiederum anders aufgebaut.
Das ist mir klar, ich verwenden zwar kein IPv6 weil ich nicht so recht den weis wie das so richtig Funktioniert (ich hasse Technik die ich nicht verstehe, also immer her mit ein paar netten Deutschen Linux+IPv6 URL's) mfg Betz Stefan PS: Schon interresant zu erfahren wie verschiedene Leute an Probleme herangehen würden, ich hätte da einfach mein RE genommen und gut ist, aber es geht halt IMMER auch anders... -- Das Telefonnetz... Unendliche Weiten... Dies sind die Abenteuer eines genervten Internet-Surfers... Weit von zu Hause entfernt stößt er in Bereiche des Systems vor, die vorher noch niemand gesehen hat... _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (5)
-
Florian Fredegar Haftmann
-
Fritz Cizmarov
-
René Liebscher
-
Stefan J. Betz
-
Stefan Schwarzer