Encontrar patrones en los textos usando expresiones regulares

El programa anterior de búsqueda de números de teléfono funciona, pero utiliza mucho código para hacer algo limitado: la función isPhoneNumber() tiene 17 líneas pero sólo puede encontrar un patrón de números de teléfono. ¿Qué pasa con un número de teléfono con el formato 415.555.4242 o (415) 555-4242? ¿Y si el número de teléfono tiene una extensión, como 415-555-4242 x99? La función isPhoneNumber() no los validaría. Podría añadir más código para estos patrones adicionales, pero hay una forma más sencilla.

Las expresiones regulares, llamadas regexes para abreviar, son descripciones para un patrón de texto. Por ejemplo, una \d en una regex significa un carácter de dígito, es decir, cualquier número del 0 al 9. El regex \d\d\d-\d\d\d-\d\d\d\d es utilizado por Python para coincidir con el mismo patrón de texto que la función del articulo anterior isPhoneNumber(): una cadena de tres números, un guión, tres números más, otro guión, y cuatro números. Cualquier otra cadena no coincidiría con la expresión regular \d\d\d-\d\d\d-\d\d\d\d

Pero las expresiones regulares pueden ser mucho más sofisticadas. Por ejemplo, añadir un 3 entre llaves ({3}) después de un patrón es como decir: «Coincide con este patrón tres veces». Así, la expresión regular ligeramente más corta \d{3}-\d{3}-\d{4} también coincide con el formato correcto del número de teléfono.

Creación de objetos regex.

Todas las funciones regex en Python están en el módulo re. Introduzca lo siguiente en el shell interactivo para importar este módulo:

import re

Pasar un valor de cadena que represente su expresión regular a re.compile() devuelve un objeto patrón Regex (o simplemente, un objeto Regex).

Para crear un objeto Regex que coincida con el patrón del número de teléfono, introduzca lo siguiente en el shell interactivo. (Recuerde que \d significa «un carácter de dígito» y \d\d\d-\d\d\d-\d\d\d\d es la expresión regular para un patrón de número de teléfono).

>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

Ahora la variable phoneNumRegex contiene un objeto Regex.

Comparación de objetos Regex

El método search() de un objeto Regex busca en la cadena que se le pasa cualquier coincidencia con el regex. El método search() devolverá None si el patrón regex no se encuentra en la cadena. Si el patrón se encuentra, el método search() devuelve un objeto Match, que tiene un método group() que devolverá el texto coincidente real de la cadena buscada. (Explicaré los grupos en breve.) Por ejemplo, introduzca lo siguiente en el shell interactivo:

>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo = phoneNumRegex.search('My number is 415-555-4242.')
>>> print('Phone number found: ' + mo.group())
Phone number found: 415-555-4242

El nombre de la variable mo es sólo un nombre genérico que se utiliza para los objetos Match. Este ejemplo puede parecer complicado al principio, pero es mucho más corto que el programa anterior isPhoneNumber.py y hace lo mismo.

Aquí, pasamos nuestro patrón deseado a re.compile() y almacenamos el objeto Regex resultante en phoneNumRegex. Luego llamamos a search() en phoneNumRegex y le pasamos a search() la cadena que queremos que coincida durante la búsqueda. El resultado de la búsqueda se almacena en la variable mo. En este ejemplo, sabemos que nuestro patrón se encontrará en la cadena, por lo que sabemos que se devolverá un objeto Match. Sabiendo que mo contiene un objeto Match y no el valor nulo None, podemos llamar a group() sobre mo para devolver la coincidencia. Escribir mo.group() dentro de nuestra llamada a la función print() muestra la coincidencia completa, 415-555-4242.

Pasos realizado para buscar un patrón de expresiones regulares en un texto.

Aunque hay varios pasos para usar expresiones regulares en Python, cada paso es bastante simple.

  • Importar el módulo regex con import re.
  • Cree un objeto Regex con la función re.compile(). (Recuerde usar una cadena sin procesar).
  • Pase la cadena que desea buscar en el método search() del objeto Regex. Esto devuelve un objeto Match.
  • Llame al método group() del objeto Match para que le devuelva una cadena con el texto coincidente.

Aunque te animo a introducir el código de ejemplo en el intérprete de comandos interactivo, también deberías hacer uso de los comprobadores de expresiones regulares basados en la web, que pueden mostrarte exactamente cómo una regex coincide con un trozo de texto que introduces. Recomiendo el comprobador de https://pythex.org/.

Deja una respuesta