Introducci贸n a las expresiones regulares en Python

    En este tutorial aprenderemos sobre el uso de expresiones regulares en Python, incluida su sintaxis, y c贸mo construirlas usando m贸dulos incorporados de Python. Para hacer esto, cubriremos las diferentes operaciones en Python re m贸duloy c贸mo usarlo en sus aplicaciones Python.

    驴Qu茅 son las expresiones regulares?

    Las expresiones regulares son b谩sicamente una secuencia de caracteres que se pueden usar para definir un patr贸n de b煤squeda para encontrar texto. Este “motor de b煤squeda” est谩 integrado en el lenguaje de programaci贸n Python (y muchos otros lenguajes tambi茅n) y est谩 disponible a trav茅s del re m贸dulo.

    Para usar expresiones regulares (o “regex” para abreviar), generalmente especifica las reglas para el conjunto de posibles cadenas que desea hacer coincidir y luego se hace preguntas como “驴Esta cadena coincide con el patr贸n?” O “驴Hay un 驴coincide con el patr贸n en cualquier lugar de esta cadena? “.

    Tambi茅n puede usar expresiones regulares para modificar una cadena o dividirla de varias formas. Todas estas operaciones de “orden superior” comienzan haciendo coincidir primero el texto con la cadena de expresiones regulares, y luego la cadena se puede manipular (como si se dividiera) una vez que se encuentra la coincidencia. Todo esto es posible gracias a la re m贸dulo disponible en Python, que veremos m谩s adelante en algunas secciones posteriores.

    Sintaxis de expresiones regulares

    Una expresi贸n regular especifica un patr贸n que tiene como objetivo coincidir con la cadena de entrada. En esta secci贸n mostraremos algunos de los caracteres y patrones especiales que puede usar para hacer coincidir cadenas.

    Personajes a juego

    Las expresiones regulares pueden contener tanto caracteres especiales como ordinarios. La mayor铆a de los caracteres ordinarios, como ‘A’, ‘a’ o ‘0’, son las expresiones regulares m谩s simples; simplemente se emparejan a s铆 mismos. Tambi茅n hay otros caracteres especiales que no pueden coincidir, es decir, ^, $, *, +, ?, {, }, [, ], , |, (y ). Esto se debe a que se utilizan para la funcionalidad de coincidencia de orden superior, que se describe m谩s adelante en esta tabla:

    Descripci贸n de metacaracteres

    *Coincide con el elemento anterior cero o m谩s veces. Por ejemplo, ab*c coincide con “ac”, “abc”, “abbbc”, etc. [xyz]* coincide con “”, “x”, “y”, “z”, “zx”, “zyx”, “xyzzy”, etc. (ab)* coincide con “”, “ab”, “abab”, “ababab”, etc.
    +Coincide con el elemento anterior una o m谩s veces. Por ejemplo, ab+c coincide con “abc”, “abbc”, “abbbc”, etc., pero no con “ac”.
    ?Coincide con el elemento anterior cero o una vez. Por ejemplo, ab?c s贸lo coincide con “ac” o “abc”.
    |El operador de elecci贸n (tambi茅n conocido como alternancia o uni贸n de conjuntos) coincide con la expresi贸n anterior o posterior a este operador. Por ejemplo, abc|def puede coincidir con “abc” o “def”.
    .Coincide con cualquier car谩cter individual (muchas aplicaciones excluyen las nuevas l铆neas, y exactamente qu茅 caracteres se consideran nuevas l铆neas es espec铆fico para el sabor, la codificaci贸n de caracteres y la plataforma, pero es seguro asumir que se incluye el car谩cter de salto de l铆nea). Dentro de las expresiones de corchetes POSIX, el car谩cter de punto coincide con un punto literal. Por ejemplo, a.c coincide con “abc”, etc., pero [a.c] s贸lo coincide con “a”, “.” o “c”.
    ^Coincide con la posici贸n inicial en la String, como el startsWith() funci贸n. En las herramientas basadas en l铆neas, coincide con la posici贸n inicial de cualquier l铆nea.
    ?Coincide con la posici贸n final de la cadena o la posici贸n justo antes de una nueva l铆nea al final de la cadena, como el endsWith() funci贸n. En las herramientas basadas en l铆neas, coincide con la posici贸n final de cualquier l铆nea.

    Cr茅dito a Wikipedia por algunas de las descripciones de expresiones regulares.

    M茅todos de expresiones regulares en Python

    Hay varios m茅todos disponibles para usar expresiones regulares. Aqu铆 vamos a discutir algunos de los m茅todos m谩s com煤nmente usados 鈥嬧媦 tambi茅n daremos algunos ejemplos de c贸mo se usan. Estos m茅todos incluyen:

    • revancha()
    • investigaci贸n()
    • re.findall ()
    • re.split ()
    • re.sub ()
    • re.compile ()

    re.match (patr贸n, cadena, banderas = 0)

    Esta expresi贸n se utiliza para hacer coincidir un car谩cter o un conjunto de caracteres al principio de una cadena. Tambi茅n es importante tener en cuenta que esta expresi贸n solo coincidir谩 al principio de la cadena y no al comienzo de cada l铆nea si la cadena dada tiene varias l铆neas.

    La siguiente expresi贸n volver谩 None porque Python no aparece al principio de la cadena.

    # match.py
    
    import re
    result = re.match(r'Python', 'It's  easy to learn Python. Python also has elegant syntax')
    
    print(result)
    
    $ python match.py
    None
    

    re.search (patr贸n, cadena)

    Este m贸dulo buscar谩 una coincidencia en cualquier lugar de la cadena dada y devolver谩 los resultados si los encuentra, y None si no se encuentra.

    En el siguiente c贸digo simplemente estamos tratando de encontrar si la palabra “cachorro” aparece en la cadena “Daisy encontr贸 un cachorro”.

    # search.py
    
    import re
    
    if re.search("puppy", "Daisy found a puppy."):
        print("Puppy found")
    else:
        print("No puppy")
    

    Aqu铆 primero importamos el re y util铆celo para buscar la ocurrencia de la subcadena “cachorro” en la cadena “Daisy encontr贸 un cachorro”. Si existe en la cadena, un re.MatchObject se devuelve, que se considera “veraz” cuando se eval煤a en una sentencia if.

    $ python search.py 
    Puppy found
    

    re.compile (patr贸n, banderas = 0)

    Este m茅todo se usa para compilar un patr贸n de expresi贸n regular en un objeto de expresi贸n regular, que se puede usar para hacer coincidencias usando su match() y search() m茅todos, que hemos discutido anteriormente. Esto tambi茅n puede ahorrar tiempo ya que el an谩lisis / manejo de cadenas de expresiones regulares puede ser computacionalmente costoso de ejecutar.

    # compile.py
    
    import re
    
    pattern = re.compile('Python')
    result = pattern.findall('Pythonistas are programmers that use Python, which is an easy-to-learn and powerful language.')
    
    print(result)
    
    find = pattern.findall('Python is easy to learn')
    
    print(find)
    
    $ python compile.py 
    ['Python', 'Python']
    ['Python']
    

    Tenga en cuenta que solo se devuelve la cadena coincidente, a diferencia de la palabra completa en el caso de “Pythonistas”. Esto es m谩s 煤til cuando se usa una cadena de expresiones regulares que tiene caracteres de coincidencia especiales.

    re.sub (patr贸n, respuesta, cadena)

    Como sugiere el nombre, esta expresi贸n se utiliza para buscar y sustituir una nueva cadena si se produce el patr贸n.

    # sub.py
    
    import re
    result = re.sub(r'python', 'ruby', 'python is a very easy language')
    
    print(result)
    
    $ python sub.py 
    ruby is a very easy language
    

    re.findall (patr贸n, String)

    Como ha visto antes de esta secci贸n, este m茅todo busca y recupera una lista de todas las ocurrencias en la cadena dada. Combina las funciones y propiedades de re.search() y re.match(). El siguiente ejemplo recuperar谩 todas las apariciones de “Python” de la cadena.

    # findall.py
    
    import re
    
    result = re.findall(r'Python', 'Python is an easy to learn, powerful programming language. Python also has elegant syntax')
    print(result)
    
    $ python findall.py 
    ['Python', 'Python']
    

    Nuevamente, usar una cadena de coincidencia exacta como esta (“Python”) solo es 煤til para encontrar si la cadena de expresiones regulares ocurre en la cadena dada, o cu谩ntas veces ocurre.

    re.split (patr贸n, cadena, maxsplit = 0, banderas = 0)

    Esta expresi贸n dividir谩 una cadena en la ubicaci贸n en la que ocurre el patr贸n especificado en la cadena. Tambi茅n devolver谩 el texto de todos los grupos en el patr贸n si una funci贸n avanzada como capturando par茅ntesis se utilizan en el patr贸n.

    # split.py
    
    import re
    
    result =  re.split(r"y", "Daisy found a puppy")
    
    if result:
        print(result)
    else:
       print("No puppy")
    

    Como puede ver arriba, el patr贸n de caracteres “y” ocurre tres veces y la expresi贸n se ha dividido en todos los casos en los que ocurre.

    $ python split.py 
    ['Dais', ' found a pupp', '']
    

    Usos pr谩cticos de las expresiones regulares

    Lo sepa o no, usamos expresiones regulares casi a diario en nuestras aplicaciones. Dado que las expresiones regulares est谩n disponibles en casi todos los lenguajes de programaci贸n, no es f谩cil escapar de su uso. Veamos algunas de las formas en que se pueden usar las expresiones regulares en sus aplicaciones.

    Construyendo URL

    Cada p谩gina web tiene una URL. Ahora imagina que tienes un sitio web de Django con una direcci贸n como “http://www.example.com/products/27/“, donde 27 es el ID de un producto. Ser铆a muy engorroso escribir vistas separadas para que coincidan con cada producto.

    Sin embargo, con expresiones regulares, podemos crear un patr贸n que coincidir谩 con la URL y extraer谩 la ID por nosotros:

    Una expresi贸n que coincidir谩 y extraer谩 cualquier ID num茅rico podr铆a ser ^products/(d+)/$.

    • ^products/ le dice a Django que coincida con una cadena que tiene “productos /” al principio de la URL (donde “comienzo” de la cadena se especifica mediante ^)
    • (d+) significa que habr谩 un n煤mero (especificado por d+) y lo queremos capturado y extra铆do (especificado por par茅ntesis)
    • / le dice a Django que debe seguir otro car谩cter “/”
    • $ indica el final de la URL, lo que significa que solo las cadenas que terminan con / coincidir谩n con este patr贸n

    Validaci贸n de direcciones de correo electr贸nico

    Cada sistema de autenticaci贸n requiere que los usuarios se registren e inicien sesi贸n antes de que se les permita el acceso al sistema. Podemos usar expresiones regulares para verificar si una direcci贸n de correo electr贸nico proporcionada tiene un formato v谩lido.

    # validate_email.py
    
    import re
    
    email = "[email聽protected]"
    
    if not re.match(re.compile(r'^[email聽protected][^.].*.[a-z]{2,10}$', flags=re.IGNORECASE), email):
        print("Enter a valid email address")
    else:
        print("Email address is valid")
    

    Como puede ver, esta es una cadena de expresiones regulares bastante complicada. Vamos a desglosarlo un poco usando la direcci贸n de correo electr贸nico de ejemplo en el c贸digo anterior. B谩sicamente significa lo siguiente:

    • ^[email聽protected]: Coincide con todos los caracteres desde el principio de la cadena hasta el car谩cter ‘@’
      • Partidos “[email聽protected]” de “[email聽protected]”
    • [^.].*: Coincide con todos los caracteres excepto “.”
      • Coincide con “gmail” de “[email聽protected]”
    • .[a-z]{2,10}$: Haga coincidir los caracteres del TLD del dominio (con una longitud m谩xima de 10 caracteres) hasta el final de la cadena
      • Coincide con “.com” de “[email聽protected]”

    Entonces, como era de esperar, el c贸digo coincide con nuestra direcci贸n de ejemplo:

    $ python validate_email.py 
    Email address is valid
    

    Validaci贸n de n煤meros de tel茅fono

    El siguiente ejemplo se utiliza para validar una lista de n煤meros canadienses con prefijo:

    # validate_numbers.py
    
    import re
    
    numbers = ["+18009592809", "=18009592809"]
    
    for number in numbers:
        if not re.match(re.compile(r"^(+1?[-. ]?(d+))$"), number):
            print("Number is not valid")
        else:
            print("Number is valid")
    
    $ python validate_numbers.py 
    Number is valid
    Number is not valid
    

    Como puede ver, debido a que el segundo n煤mero usa un car谩cter “=” en lugar de “+”, se considera inv谩lido.

    Filtrar contenido no deseado

    Las expresiones regulares tambi茅n se pueden usar para filtrar ciertas palabras de los comentarios de las publicaciones, lo cual es particularmente 煤til en publicaciones de blogs y redes sociales. El siguiente ejemplo muestra c贸mo puede filtrar las palabras preseleccionadas que los usuarios no deben usar en sus comentarios.

    # filter.py
    
    import re
    
    curse_words = ["foo", "bar", "baz"]
    comment = "This string contains a foo word."
    curse_count = 0
    
    for word in curse_words:
        if re.search(word, comment):
            curse_count += 1
    
    print("Comment has " + str(curse_count) + " curse word(s).")
    
    $ python filter.py 
    Comment has 1 curse word(s).
    

    Conclusi贸n

    Este tutorial ha cubierto lo que se necesita para poder usar expresiones regulares en cualquier aplicaci贸n. No dude en consultar la documentaci贸n del re m贸dulo, que tiene una gran cantidad de recursos para ayudarlo a lograr los objetivos de su aplicaci贸n.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *