Estoy creando una aplicación en Google App Engine. Soy increíblemente nuevo en Python y me he estado golpeando la cabeza contra el siguiente problema durante los últimos 3 días.
Tengo una clase para representar una fuente RSS y en esta clase tengo un método llamado setUrl. La entrada a este método es una URL.
Estoy tratando de usar el módulo re python para validar el RFC 3986 Reg-ex ( http://www.ietf.org/rfc/rfc3986.txt )
A continuación se muestra un recorte que debería funcionar.
p = re.compile('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?')
m = p.match(url)
if m:
self.url = url
return url
python
regex
google-app-engine
Zee Spencer
fuente
fuente
urlparse
módulo se cambia el nombre aurllib.parse
en Python 3. Verificar docs.python.org/3.7/library/...Respuestas:
Una manera fácil de analizar (y validar) URL de la es
urlparse
( AP2 , AP3 ) módulo.Una expresión regular es demasiado trabajo.
No existe un método de "validación" porque casi todo es una URL válida. Existen algunas reglas de puntuación para dividirlo. Sin ningún signo de puntuación, todavía tiene una URL válida.
Revise la RFC con cuidado y vea si puede construir una URL "no válida". Las reglas son muy flexibles.
Por ejemplo,
:::::
es una URL válida. El camino es":::::"
. Un nombre de archivo bastante estúpido, pero un nombre de archivo válido.Además,
/////
es una URL válida. El netloc ("nombre de host") es""
. El camino es"///"
. De nuevo, estúpido. También válido. Esta URL se normaliza a"///"
cuál es el equivalente.Algo así
"bad://///worse/////"
es perfectamente válido. Tonta pero válida.Línea de fondo . Analízalo y mira las piezas para ver si son desagradables de alguna manera.
¿Quiere que el esquema sea siempre "http"? ¿Quiere que netloc sea siempre "www.somename.somedomain"? ¿Quieres que la ruta se parezca a unix? ¿O como una ventana? ¿Quieres eliminar la cadena de consulta? ¿O conservarlo?
Estas no son validaciones especificadas por RFC. Estas son validaciones exclusivas de su aplicación.
fuente
urlparse
debe aumentarse con expresiones regulares para validar un netloc (u otra parte) contra un estándar en particular.urlparse({})
cuando la entrada no es ni siquiera una cadena, se realiza correctamente sin un error visibleAquí está la expresión regular completa para analizar una URL.
Dada su complejidad, creo que debería seguir el camino urlparse.
Para completar, aquí está el pseudo-BNF de la expresión regular anterior (como documentación):
fuente
Estoy usando el que usa Django y parece funcionar bastante bien:
Siempre puede consultar la última versión aquí: https://github.com/django/django/blob/master/django/core/validators.py#L74
fuente
Lo admito, encuentro su expresión regular totalmente incomprensible. Me pregunto si podrías usar urlparse en su lugar. Algo como:
Puede que sea más lento y tal vez se pierda las condiciones, pero me parece (a mí) mucho más fácil de leer y depurar que una expresión regular para URL .
fuente
urlparse
se cambia el nombre del módulo aurllib.parse
en Python 3. Verifique docs.python.org/3.7/library/…urlparse
felizmente toma URL no válidas, es más una biblioteca de división de cadenas que cualquier tipo de validador. Por ejemplo:Dependiendo de la situación, esto podría estar bien.
Si confía principalmente en los datos y solo desea verificar que el protocolo sea HTTP, entonces
urlparse
es perfecto.Si desea que la URL sea en realidad una URL legal, use la expresión regular ridícula
Si desea asegurarse de que sea una dirección web real,
fuente
"http://----"
?? ¡Es una URL perfectamente válida! ¡Simplemente configure su nombre de host en "----" y ya puede usarlo!http://pypi.python.org/pypi/rfc3987 proporciona expresiones regulares para mantener la coherencia con las reglas en RFC 3986 y RFC 3987 (es decir, no con reglas específicas del esquema).
Una expresión regular para IRI_reference es:
En una línea:
fuente
nota : Lepl ya no se mantiene ni se admite.
RFC 3696 define las "mejores prácticas" para la validación de URL: http://www.faqs.org/rfcs/rfc3696.html
La última versión de Lepl (una biblioteca de analizador de Python) incluye una implementación de RFC 3696. Lo usaría de la siguiente manera:
Aunque los validadores están definidos en Lepl, que es un analizador de descendencia recursivo, en gran parte se compilan internamente en expresiones regulares. Eso combina lo mejor de ambos mundos: una definición (relativamente) fácil de leer que se puede comparar con RFC 3696 y una implementación eficiente. Hay una publicación en mi blog que muestra cómo esto simplifica el analizador: http://www.acooke.org/cute/LEPLOptimi0.html
Lepl está disponible en http://www.acooke.org/lepl y el módulo RFC 3696 está documentado en http://www.acooke.org/lepl/rfc3696.html
Esto es completamente nuevo en esta versión, por lo que puede contener errores. Por favor contácteme si tiene algún problema y lo solucionaré lo antes posible. Gracias.
fuente
Hoy en día, en el 90% de los casos, si trabaja con URL en Python, probablemente use solicitudes de Python. De ahí la pregunta aquí: ¿por qué no reutilizar la validación de URL de las solicitudes?
caracteristicas:
fuente
La expresión regular proporcionada debe coincidir con cualquier URL con el formato http://www.ietf.org/rfc/rfc3986.txt ; y lo hace cuando se prueba en el intérprete de Python.
¿Qué formato tienen las URL que ha tenido problemas para analizar?
fuente
He necesitado hacer esto muchas veces a lo largo de los años y siempre termino copiando la expresión regular de otra persona que ha pensado en ello mucho más de lo que yo quiero pensar.
Habiendo dicho eso, hay una expresión regular en el código de formularios de Django que debería funcionar:
http://code.djangoproject.com/browser/django/trunk/django/forms/fields.py#L534
fuente
expresión regular de validación de URL de django modificada:
fuente: https://github.com/django/django/blob/master/django/core/validators.py#L74
fuente
NOTA: Tan feo como se ve en su navegador, simplemente copie y pegue y el formato debería ser bueno
Se encuentra en las listas de correo de Python y se usa para gnome-terminal
fuente: http://mail.python.org/pipermail/python-list/2007-January/595436.html
fuente