Je crée une application sur Google App Engine. Je suis incroyablement nouveau sur Python et je me suis battu contre le problème suivant au cours des 3 derniers jours.
J'ai une classe pour représenter un flux RSS et dans cette classe j'ai une méthode appelée setUrl. L'entrée de cette méthode est une URL.
J'essaye d'utiliser le module re python pour valider le RFC 3986 Reg-ex ( http://www.ietf.org/rfc/rfc3986.txt )
Ci-dessous, un extrait qui devrait fonctionner?
p = re.compile('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?')
m = p.match(url)
if m:
self.url = url
return url
python
regex
google-app-engine
Zee Spencer
la source
la source
urlparse
le module est renomméurllib.parse
en Python 3. Vérifiez docs.python.org/3.7/library/…Réponses:
Un moyen simple d'analyser (et de valider) les URL est le
urlparse
( py2 , py3 ).Une regex est trop de travail.
Il n'y a pas de méthode «valider» car presque tout est une URL valide. Il existe des règles de ponctuation pour le fractionner. En l'absence de ponctuation, vous disposez toujours d'une URL valide.
Vérifiez attentivement la RFC et voyez si vous pouvez construire une URL "invalide". Les règles sont très souples.
Par exemple,
:::::
une URL valide. Le chemin est":::::"
. Un nom de fichier assez stupide, mais un nom de fichier valide.Est également
/////
une URL valide. Le netloc ("hostname") est""
. Le chemin est"///"
. Encore une fois, stupide. Aussi valable. Cette URL se normalise en"///"
laquelle est l'équivalent.Quelque chose comme ça
"bad://///worse/////"
est parfaitement valable. Dumb mais valable.Conclusion . Analysez-le et regardez les pièces pour voir si elles ne vous déplaisent pas.
Voulez-vous que le schéma soit toujours "http"? Voulez-vous que le netloc soit toujours "www.somename.somedomain"? Voulez-vous que le chemin ressemble à unix? Ou comme des fenêtres? Voulez-vous supprimer la chaîne de requête? Ou le conserver?
Ce ne sont pas des validations spécifiées par RFC. Ce sont des validations propres à votre application.
la source
urlparse
doit être augmentée avec des regex pour valider un netloc (ou une autre partie) par rapport à un standard particulier.urlparse({})
là où l'entrée n'est même pas une chaîne réussit sans erreur visibleVoici la regexp complète pour analyser une URL.
Compte tenu de sa complexité, je pense que vous devriez suivre la voie urlparse.
Pour être complet, voici le pseudo-BNF de l'expression régulière ci-dessus (en tant que documentation):
la source
J'utilise celui utilisé par Django et il semble fonctionner plutôt bien:
Vous pouvez toujours vérifier la dernière version ici: https://github.com/django/django/blob/master/django/core/validators.py#L74
la source
J'avoue, je trouve votre expression régulière totalement incompréhensible. Je me demande si vous pouvez utiliser urlparse à la place? Quelque chose comme:
Cela peut être plus lent, et peut-être que vous manquerez des conditions, mais cela me semble beaucoup plus facile à lire et à déboguer qu'une expression régulière pour les URL .
la source
urlparse
le module est renomméurllib.parse
en Python 3. Vérifiez docs.python.org/3.7/library/…urlparse
prend assez heureusement les URL invalides, c'est plus une bibliothèque de fractionnement de chaînes de chaînes que n'importe quel type de validateur. Par exemple:Selon la situation, cela peut convenir.
Si vous faites principalement confiance aux données et que vous voulez simplement vérifier que le protocole est HTTP, alors
urlparse
c'est parfait.Si vous voulez que l'URL soit en fait une URL légale, utilisez la regex ridicule
Si vous voulez vous assurer qu'il s'agit d'une véritable adresse Web,
la source
"http://----"
?? C'est une URL parfaitement valide! Définissez simplement votre nom d'hôte sur "----" et vous pouvez déjà l'utiliser!http://pypi.python.org/pypi/rfc3987 donne des expressions régulières pour assurer la cohérence avec les règles de la RFC 3986 et de la RFC 3987 (c'est-à-dire pas avec les règles spécifiques au schéma).
Une expression régulière pour IRI_reference est:
En une seule ligne:
la source
note - Lepl n'est plus maintenu ou pris en charge.
La RFC 3696 définit les «meilleures pratiques» pour la validation d'URL - http://www.faqs.org/rfcs/rfc3696.html
La dernière version de Lepl (une bibliothèque d'analyseurs Python) inclut une implémentation de la RFC 3696. Vous l'utiliseriez quelque chose comme:
Bien que les validateurs soient définis dans Lepl, qui est un analyseur de descendance récursive, ils sont largement compilés en interne vers des expressions régulières. Cela combine le meilleur des deux mondes - une définition (relativement) facile à lire qui peut être vérifiée par rapport à la RFC 3696 et une implémentation efficace. Il y a un article sur mon blog montrant comment cela simplifie l'analyseur - http://www.acooke.org/cute/LEPLOptimi0.html
Lepl est disponible sur http://www.acooke.org/lepl et le module RFC 3696 est documenté sur http://www.acooke.org/lepl/rfc3696.html
Ceci est complètement nouveau dans cette version et peut donc contenir des bogues. Veuillez me contacter si vous avez des problèmes et je les réparerai dès que possible. Merci.
la source
De nos jours, dans 90% des cas, si vous travaillez avec des URL en Python, vous utilisez probablement des requêtes python. D'où la question ici - pourquoi ne pas réutiliser la validation d'URL à partir des requêtes?
Fonctionnalités:
la source
Le regex fourni doit correspondre à n'importe quelle URL de la forme http://www.ietf.org/rfc/rfc3986.txt ; et le fait lorsqu'il est testé dans l'interpréteur python.
Quel est le format des URL que vous rencontrez des problèmes d'analyse?
la source
J'ai eu besoin de le faire plusieurs fois au fil des ans et je finis toujours par copier l'expression régulière de quelqu'un d'autre qui y a pensé beaucoup plus que je ne veux y penser.
Cela dit, il y a une regex dans le code des formulaires Django qui devrait faire l'affaire:
http://code.djangoproject.com/browser/django/trunk/django/forms/fields.py#L534
la source
regex de validation d'url django modifié:
source: https://github.com/django/django/blob/master/django/core/validators.py#L74
la source
REMARQUE: aussi moche que cela puisse paraître dans votre navigateur, copiez simplement et le formatage devrait être bon
Trouvé dans les listes de diffusion python et utilisé pour le terminal gnome
source: http://mail.python.org/pipermail/python-list/2007-January/595436.html
la source