Ich erstelle eine App auf Google App Engine. Ich bin unglaublich neu in Python und habe in den letzten 3 Tagen meinen Kopf gegen das folgende Problem geschlagen.
Ich habe eine Klasse, die einen RSS-Feed darstellt, und in dieser Klasse habe ich eine Methode namens setUrl. Die Eingabe für diese Methode erfolgt über eine URL.
Ich versuche, das Python-Modul zum Validieren des RFC 3986 Reg-ex zu verwenden ( http://www.ietf.org/rfc/rfc3986.txt ).
Unten ist ein Ausschnitt, der funktionieren sollte ?
p = re.compile('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?')
m = p.match(url)
if m:
self.url = url
return url
python
regex
google-app-engine
Zee Spencer
quelle
quelle
urlparse
Modul wirdurllib.parse
in Python 3 umbenannt . Überprüfen Sie docs.python.org/3.7/library/…Antworten:
Eine einfache Möglichkeit , URLs zu analysieren (und zu validieren), ist das Modul
urlparse
( py2 , py3 ).Ein Regex ist zu viel Arbeit.
Es gibt keine "Validierungs" -Methode, da fast alles eine gültige URL ist. Es gibt einige Interpunktionsregeln für die Aufteilung. Ohne Interpunktion haben Sie immer noch eine gültige URL.
Überprüfen Sie den RFC sorgfältig und prüfen Sie, ob Sie eine "ungültige" URL erstellen können. Die Regeln sind sehr flexibel.
Zum Beispiel
:::::
ist eine gültige URL. Der Weg ist":::::"
. Ein ziemlich dummer Dateiname, aber ein gültiger Dateiname.Auch
/////
ist eine gültige URL. Das Netloc ("Hostname") ist""
. Der Weg ist"///"
. Wieder dumm. Auch gültig. Diese URL normalisiert sich zu"///"
der entsprechenden URL .So etwas
"bad://///worse/////"
ist vollkommen gültig. Dumm aber gültig.Fazit . Analysieren Sie es und sehen Sie sich die Teile an, um festzustellen, ob sie auf irgendeine Weise unangenehm sind.
Möchten Sie, dass das Schema immer "http" ist? Möchten Sie, dass der Netloc immer "www.somename.somedomain" ist? Möchten Sie, dass der Pfad unixartig aussieht? Oder fensterartig? Möchten Sie die Abfragezeichenfolge entfernen? Oder bewahren?
Dies sind keine RFC-spezifizierten Validierungen. Dies sind Validierungen, die nur für Ihre Anwendung gelten.
quelle
urlparse
ergänzt werden, um ein Netloc (oder einen anderen Teil) anhand eines bestimmten Standards zu validieren.urlparse({})
wenn die Eingabe nicht einmal eine Zeichenfolge ist, ohne einen sichtbaren Fehler erfolgreich istHier ist der vollständige reguläre Ausdruck zum Parsen einer URL.
Angesichts seiner Komplexität denke ich, dass Sie den urlparse Weg gehen sollten.
Der Vollständigkeit halber hier die Pseudo-BNF des obigen regulären Ausdrucks (als Dokumentation):
quelle
Ich benutze die von Django verwendete und es scheint ziemlich gut zu funktionieren:
Sie können jederzeit die neueste Version hier überprüfen: https://github.com/django/django/blob/master/django/core/validators.py#L74
quelle
Ich gebe zu, ich finde Ihren regulären Ausdruck völlig unverständlich. Ich frage mich, ob Sie stattdessen urlparse verwenden könnten. Etwas wie:
Es mag langsamer sein und Sie werden vielleicht Bedingungen verpassen, aber es scheint (für mich) viel einfacher zu lesen und zu debuggen als ein regulärer Ausdruck für URLs .
quelle
urlparse
Modul wirdurllib.parse
in Python 3 umbenannt . Überprüfen Sie docs.python.org/3.7/library/…urlparse
Gerne werden ungültige URLs verwendet. Es handelt sich eher um eine Bibliothek zum Teilen von Zeichenfolgen als um irgendeine Art von Validator. Beispielsweise:Je nach Situation kann dies in Ordnung sein.
Wenn Sie den Daten größtenteils vertrauen und nur überprüfen möchten, ob das Protokoll HTTP ist,
urlparse
ist dies perfekt.Wenn Sie möchten, dass die URL tatsächlich eine legale URL ist, verwenden Sie den lächerlichen regulären Ausdruck
Wenn Sie sicherstellen möchten, dass es sich um eine echte Webadresse handelt,
quelle
"http://----"
?? Es ist eine vollkommen gültige URL! Setzen Sie einfach Ihren Hostnamen auf "----" und Sie können ihn bereits verwenden!http://pypi.python.org/pypi/rfc3987 enthält reguläre Ausdrücke für die Konsistenz mit den Regeln in RFC 3986 und RFC 3987 (dh nicht mit schemaspezifischen Regeln).
Ein regulärer Ausdruck für IRI_reference lautet:
In einer Zeile:
quelle
Hinweis - Lepl wird nicht mehr gewartet oder unterstützt.
RFC 3696 definiert "Best Practices" für die URL-Validierung - http://www.faqs.org/rfcs/rfc3696.html
Die neueste Version von Lepl (eine Python-Parser-Bibliothek) enthält eine Implementierung von RFC 3696. Sie würden sie wie folgt verwenden:
Obwohl die Validatoren in Lepl definiert sind, einem rekursiven Abstiegsparser, werden sie größtenteils intern zu regulären Ausdrücken kompiliert. Das kombiniert das Beste aus beiden Welten - eine (relativ) einfach zu lesende Definition, die mit RFC 3696 verglichen werden kann, und eine effiziente Implementierung. In meinem Blog gibt es einen Beitrag, der zeigt, wie dies den Parser vereinfacht - http://www.acooke.org/cute/LEPLOptimi0.html
Lepl ist unter http://www.acooke.org/lepl verfügbar und das RFC 3696-Modul ist unter http://www.acooke.org/lepl/rfc3696.html dokumentiert
Dies ist in dieser Version völlig neu und kann daher Fehler enthalten. Bitte kontaktieren Sie mich, wenn Sie Probleme haben und ich werde sie so schnell wie möglich beheben. Vielen Dank.
quelle
Heutzutage verwenden Sie in 90% der Fälle, wenn Sie mit URL in Python arbeiten, wahrscheinlich Python-Anfragen. Daher die Frage hier - warum nicht die URL-Validierung von Anfragen wiederverwenden?
Eigenschaften:
quelle
Der bereitgestellte Regex sollte mit einer beliebigen URL des Formulars http://www.ietf.org/rfc/rfc3986.txt übereinstimmen . und tut dies, wenn es im Python-Interpreter getestet wird.
Welches Format hatten die URLs, bei denen Sie Probleme beim Parsen hatten?
quelle
Ich musste dies im Laufe der Jahre viele Male tun und am Ende immer den regulären Ausdruck eines anderen kopieren, der viel mehr darüber nachgedacht hat, als ich darüber nachdenken möchte .
Allerdings gibt es im Django-Formularcode einen regulären Ausdruck, der den Trick machen sollte:
http://code.djangoproject.com/browser/django/trunk/django/forms/fields.py#L534
quelle
modifizierter regulärer Ausdruck der Django-URL-Validierung:
Quelle: https://github.com/django/django/blob/master/django/core/validators.py#L74
quelle
HINWEIS: So hässlich es in Ihrem Browser aussieht, kopieren Sie es einfach und die Formatierung sollte gut sein
Gefunden bei den Python-Mailinglisten und für das Gnome-Terminal verwendet
Quelle: http://mail.python.org/pipermail/python-list/2007-January/595436.html
quelle