Valider une adresse email avec une regex en Python


Problème de tous les jours, et on a tous essayé de concocter notre solution maison. Mais il se trouve que la norme qui définit le format des adresses emails est vraiment tordue.

Si on est trop rigide, on interdit les cas contre-intuitifs comme le signe ‘+’ dans le destinataire, le domaine “.museum”, l’adresse IP dans l’email ou le sous domaine comportant un seul caractère.

Si on est trop flexible, l’utilisateur va rentrer truc@chose et ne pas s’apercevoir de sa faute de frappe. Il oubliera alors votre site, sans email pour le contacter.

Il existe une version bullet proof de regex qui valide une adresse email, mais c’est un truc de malade.

Au final, on veut juste attraper 99% des cas les plus courrants, un compromis en solidité et praticité. Le code source de Django nous fournit justement une solution équilibrée dans le fichier core/validators.py:

>>> email_re = re.compile(
r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
r')@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$', re.IGNORECASE)  # domain
>>> email_re.search('test+12@moi.n.museum')
<_sre.SRE_Match object at 0x1205160>
>>> email_re.search('test@moi')
>>>

Par contre, ça ne gère pas l’adresse IP en tant que nom de domaine, mais c’est le plus souvent suffisant.

2 thoughts on “Valider une adresse email avec une regex en Python

  • Guts

    Hola

    Gracias pour cette petite regex qui va bien :)
    La même pour une URL et je brûle un ou deux cierges sur l’autel du python pour vous ^^

    J

  • Sam Post author

    Un truc dans le genre :

    >>> pattern = re.compile(r"""(?i)b((?:[a-z][w-]+:(?:/{1,3}|[a-z0-9%])|wwwd{0,3}[.]|[a-z0-9.-]+[.][a-z]{2,4}/)(?:[^s()<>]+|(([^s()<>]+|(([^s()<>]+)))*))+(?:(([^s()<>]+|(([^s()<>]+)))*)|[^s`!()[]{};:'".,<>?«»“”‘’]))""")
    >>> res = pattern.findall(text)

    ?

    Ca retourne un tuple de tuple de 4 éléments dont le premier est une URL.

    Mais attention, aucune regex ne permet un matching parfait.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.