Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Python: validare e-mail, URL e numeri di telefono

Python: le librerie, i moduli e le funzioni del linguaggio per validare indirizzi email, URL e numeri di telefono
Python: le librerie, i moduli e le funzioni del linguaggio per validare indirizzi email, URL e numeri di telefono
Link copiato negli appunti

La validazione è una procedura di verifica che consente di stabilire se il formato di un elemento, ad esempio una stringa, corrisponde effettivamente a determinati criteri. Tale operazione è utile sia per ragioni di conformità, ad esempio quando è necessario che l'input inviato tramite un form presenti dei requisiti specifici per essere accettato da un'applicazione o caricato in un database, che di sicurezza, per evitare l'invio arbitrario di informazioni verso un sistema.

In questa breve guida parleremo di validazione in Python e, nello specifico, di come tale linguaggio di programmazione possa essere utilizzato per verificare il formato di un indirizzo di posta elettronica, un URL e un numero di telefono.

Validare un indirizzo e-mail con Python

Un indirizzo email è composto da tre elementi:

  • un nome, detto anche local part;
  • il simbolo della chiocciola, "@";
  • un nome a dominio o domain part.

Più indirizzi e-mail possono avere la stessa local part ma non possono esistere due indirizzi e-mail con la medesima domain part che abbiano una local part uguale. Nello specifico non si possono avere due indirizzi e-email "mail@nomeadominio.com". La chiocciola ("at") funge da separatore mentre la domain part è composta, appunto, da un dominio e da un'estensione. Due nome a dominio possono avere lo stesso dominio ma non si possono avere due nome a dominio che abbiano sia dominio che estensione uguali.

Python mette a disposizione la libreria email_validator per la validazione degli indirizzi di posta elettronica o, per meglio dire, del loro formato. Quest'ultima può essere installata facilmente trami pip, il package installer del linguaggio, tramite la seguente istruzione:

pip install email_validator

Su Windows, ad esempio, una volta lanciato il comando da PowerShell dovremmo avere un output come il seguente. Esso comprende anche l'installazione delle dipendenze indispensabili per il funzionamento della libreria:

Fatto questo possiamo passare al codice per la validazione che si basa sostanzialmente su due fasi: l'importazione di email_validator e l'utilizzo del metodo validate_email():

import email_validator
def validazione_email(email):
    try:
        email_validator.validate_email(email)
        return True
    except email_validator.EmailNotValidError:
        return False
email = "unaemail@unaemail.org"
if validazione_email(email):
    print("Formato e-mail valido.")
else:
    print("Formato e-mail non valido.")

Una volta importata la libreria viene creata una nuova funzione, validazione_email(), a cui passare come argomento l'email da validare. Tale funzione prevede che quest'ultima venga verificata da validate_email(). In caso di esito positivo restituisce TRUE, diversamente restituisce FALSE.

Validare un URL con Python

Nella sua forma più semplice un URL (Uniform Resource Locator) è composto da:

  • il riferimento ad un protocollo, o schema, ad esempio "https://";
  • il prefisso "www" separato dall'elemento seguente tramite un punto;
  • un nome a dominio composto da un nome e da un'estensione separati da un punto (ad esempio "html.it").

Il prefisso "www." non è più indispensabile per la digitazione di un URL mentre è sempre necessario un suffisso, cioè l'estensione del nome a dominio. Possono esistere due domini con lo stesso nome, ad esempio "html.it" e "html.com", ma non due nome a dominio con nomi ed estensioni uguali.

Per la validazione degli URL Python fornisce una libreria apposita che prende il nome di urllib. Essa dovrebbe essere già compresa nella nostra installazione di Python, se non lo fosse potrà essere facilmente integrata tramite l'istruzione:

pip install urllib

Il package di urllib dispone di diversi moduli per l'elaborazione degli URL. Per validarne uno la più utile è urllib.parse che analizza tutti i componenti di tale stringa e permette di valutarne la conformità con la sintassi prevista per questo particolare formato.

Un esempio di validazione potrebbe essere quindi il seguente:

from urllib.parse import urlparse
def valida_url(url):
    try:
        rs = urlparse(url)
        return all([rs.scheme, rs.netloc])
    except ValueError:
        return False
url = "https://www.html.it"
if valida_url(url):
    print("URL in formato valido.")
else:
    print("URL in formato non valido.")

In pratica lo script effettua innanzitutto l'importazione del modulo per il parsing dal package. Fatto questo viene definita una nuova funzione personalizzata, valida_url(), che richiama il metodo urlparse() a cui viene passato come parametro l'URL da sottoporre a validazione. Nel dettaglio vengono verificati due elementi: lo schema (rs.scheme) e il nome a dominio (rs.netloc). Quest'ultimo prende il nome di netloc (network locality o network location) e può essere riconosciuto da urlparse() soltanto quando introdotto da "//".

In assenza di "//" l'URL analizzato non viene considerato assoluto, cioè contenente tutti i dati necessari per individuare una risorsa, ma relativo, quindi privo di uno schema che specifica la modalità di accesso ad una risorsa ("https://", "ftps://"..).

Validare un numero di telefono con Python

Esistono sostanzialmente tre sintassi per la digitazione di un recapito telefonico corretto:

  • solo numeri (ad esempio "00391111111");
  • numeri preceduti dal segno "+" (ad esempio "+39111111111");
  • una serie di gruppi di numeri separati dal segno "-" eventualmente preceduta dal segno "+" (ad esempio "+39-111-111-111").

A differenza di quanto accade con le email e gli URL, i formati dei numeri di telefono dipendono maggiormente da standard sviluppati localmente. Un numero di telefono può comunque iniziare soltanto con un numero o un segno "+", quindi non con un segno "-", questa significa che il prefisso internazionale dell'Italia può essere espresso in soli due modi: "0039" o "+39".

Nel caso specifico, invece di una libreria apposita possiamo operare una validazione tramite l'espressione regolare ^[0-9\\-\\+]*$, dove:

  • ^ si riferisce alla parte iniziale di una stringa;
  • [0-9\\-\\+] consente solo l'uso dei numeri e dei segni "-" e "+";
  • * stabilisce che i caratteri utilizzati si possono presentare 0 o più volte;
  • $ fa riferimento alla parte finale di una stringa.

Detto questo, il nostro codice per la validazione di un numero di telefono potrebbe essere come il seguente:

import re
def valida_telefono(telefono):
    pattern = re.compile("^[0-9\\-\\+]*$")
    return pattern.match(telefono) is not None
telefono = "+39111111111"
if valida_telefono(telefono):
    print("Formato valido per il numero di telefono.")
else:
    print("Formato non valido per il numero di telefono")

In esso viene importato il modulo per le espressioni regolari (import re), fatto ciò viene definito il pattern regex da utilizzare per la validazione e si controlla che il valore di ritorno della verifica non sia nullo (is not None).

L'espressione regolare ci consente quindi di stabilire se la stringa inizia e finisce con uno dei caratteri permessi e che tra il suo l'inizio e la sua fine siano presenti 0 o più ripetizioni dei caratteri validi per un numero di telefono.

L'esito del controllo sarebbe stato positivo anche validando lo stesso numero nei formati "0039111111111", "0039-111-111-111" o "+39-111-111-111".

I limiti della validazione

La validazione di indirizzi e-mail, URL e numeri di telefono con Python non richiede operazioni complesse. Si tenga però conto che tutte le procedure indicate permettono di verificare la correttezza dei formati, quindi la loro conformità con gli standard, non la reale esistenza degli elementi analizzati. Il numero di telefono "+39111111111" è per esempio valido ma potrebbe anche non esistere.

Ti consigliamo anche