En este tutorial descomponemos y vemos las diferentes formas de escribir un número de teléfono. Además usaremos una sencilla expresión regular con la que poder validar los números usando Python.
Composición de un número de teléfono
Antes de empezar a programar, primero debemos conocer cómo se escribe un número telefónico. Según la RAE hay que seguir unas pautas a la hora de escribirlos.
- Los números de teléfono suelen separarse en bloques, usando espacios, puntos o guiones.
- Según la especificación E.164, un número de teléfono debe constar como máximo de 15 dígitos contando su prefijo.
- En primer lugar tenemos el Código Internacional (00) y podrá sustituirse por el signo +.
- A continuación tenemos el Código de País, que suele esta compuesto de 3 dígitos y podrá estar delimitado por paréntesis.
- El siguiente bloque corresponde al prefijo o Código de Región. Este puede ser de longitud fija de 3 cifras (España), de longitud variable de entre 2 y 5 cifras (Alemania, Austria), entre 1 y 3 dígitos (Japón), 1 y 2 dígitos (Chile), 2 y 4 dígitos (Argentina), 2 y 3 dígitos (México), etc …
- Por último tenemos el número de teléfono, que puede estar compuesto de hasta un máximo de 7 dígitos.
Sabiendo estas pautas de escritura de números de teléfono, nos podemos poner a escribir nuestro pequeño script para validar números, usando el lenguaje Python.
Módulo RE de Python
Vamos a usar el módulo RE
proporcionado por Python, que nos permite trabajar con expresiones regulares. La pregunta que nos podemos hacer, es si debemos usar el método search()
o el método match()
. Aunque ambos métodos son perfectos para buscar patrones en cadenas, hay una pequeña diferencia entre ambos.
Tanto re.search(), como re.match() retornan un objeto en caso de encontrar coincidencias y devuelven None en caso contrario. La diferencia es que re.match() sólo buscará coincidencias al comienzo de la cadena, por lo que en caso de encontrar alguna coincidencia en otra parte retorna None. Sabiendo esto, ya podemos ponernos a escribir el patrón.
1 |
regex = r"^(\(?\+[\d]{1,3}\)?)\s?([\d]{1,5})\s?([\d][\s\.-]?){6,7}$" |
La expresión regular que he creado es bastante sencilla, por lo que no vamos a complicarnos la vida. Si la descomponemos podemos ver cómo funciona:
- La expresión regular la hemos creado usando la técnica de captura de grupos (que delimita cada grupo usando paréntesis).
- Cada grupo corresponde a un bloque del número de teléfono (código de país, prefijo y número de teléfono).
- Estos grupos tienen su propio patrón y podemos acceder a ellos usando el método groups()
Para saber más sobre cómo escribir expresiones regulares (regex), podéis acceder a la guía oficial.
1 2 3 4 5 |
>>> import re >>> regex = r"^(\(?\+[\d]{1,3}\)?)\s?([\d]{1,5})\s?([\d][\s\.-|.]?){6,7}$" >>> result = re.match(regex, "+34 987 123 456") >>> print(result) <re.Match object; span=(0, 15), match='+34 987 123 456'> |
Una vez que hemos probado y sabemos que funciona nuestra expresión en el intérprete de Python, podemos crear un pequeño script, que lo que hará es comprobar una lista de números.
1 2 3 4 5 6 7 8 9 10 11 12 |
#! /usr/bin/env python3 import re def validar_telefono(tel): # expresión regular regex = r"^(\(?\+[\d]{1,3}\)?)\s?([\d]{1,5})\s?([\d][\s\.-]?){6,7}$" result = re.match(regex, tel) if result is None: return False return True |
Realicemos unos Test Unitarios de forma manual desde nuestro intérprete de Python, para comprobar si funciona correctamente.
1 2 3 4 5 6 7 8 9 |
>>> from validaciones import validar_telefono >>> validar_telefono("+34 666 01-02-03") True >>> validar_telefono("+34 666 01-02-03-04") False >>> validar_telefono("+34 666010203") True >>> validar_telefono("+34666010203") True |
Referencias de Interés
Si necesitas más documentación de interés, sobre la composición de números de teléfono, puedes seguir los siguiente enlaces:
- Módulo re de Python.
- Números de teléfono según la RAE.
- Número de Teléfono.
- Prefijos Telefónicos.
- Códigos de País.