Tutorial de Expresión Regular en Python

Jinku Hu 11 diciembre 2023
  1. Expresión Regular de Python re.match() Función
  2. Expresión regular de Python re.search() function
  3. Compilando expresiones regulares con re.complie
  4. Banderas en el módulo re de expresión regular de Python
  5. Comprobación de caracteres permitidos
  6. Busque y reemplace
  7. La función findall()
  8. La función finditer()
  9. La función split()
  10. Los patrones básicos de re
  11. Casos de repetición
  12. Repetición de la no-repetición
  13. Caracteres y secuencias especiales en re
  14. La función escape
  15. La función group()
Tutorial de Expresión Regular en Python

En este tutorial, aprenderá las expresiones regulares y las operaciones de expresión regular definidas en el módulo re en Python. re es la librería estándar de Python que soporta operaciones de coincidencia de expresiones regulares.

La expresión regular en Python es un conjunto de caracteres o secuencia que se utiliza para hacer coincidir una cadena con otro patrón utilizando una sintaxis formal. Se podría pensar en las expresiones regulares como un pequeño lenguaje de programación que está incrustado en python.

Se puede usar la expresión regular para definir algunas reglas y estas reglas se usan para crear posibles cadenas de la cadena dada con la que se quiere hacer coincidir el patrón. Las expresiones regulares en Python se interpretan como un conjunto de instrucciones.

Expresión Regular de Python re.match() Función

Puede utilizar la función de correspondencia para hacer coincidir el patrón RE con el string dado. La función de correspondencia contiene indicadores. Las banderas definen el comportamiento de una expresión regular y pueden contener diferentes valores que verá más adelante en este tutorial.

A continuación se muestra la sintaxis de la función match en Python:

re.match(pattern, string, flags)

Tiene tres argumentos,

  1. El pattern es el patrón de expresión regular que se debe emparejar
  2. La string es la cadena dada que debe ser emparejada con la expresión regular
  3. flags se usa para cambiar el comportamiento de la expresión regular, y es opcional.

Si la coincidencia se realiza con éxito, se devolverá el objeto match, o bien se devolverá None. El objeto match tiene otros dos métodos principales que son group(num) y group() funciones. El propósito principal de usar estas funciones es devolver la coincidencia o una subsecuente específica y todas las subsecuentes respectivamente.

Usando la función re.match

El siguiente ejemplo demuestra cómo puede utilizar la función match:

import re

strTest = "Hello Python Programming"
mobj = re.match(r"hello", strTest, re.I)
print(mobj.group())

En este código, en primer lugar se importa el módulo re. Luego comparará una cadena strTest con el patrón RE y el valor devuelto por la función match será asignado a mobj. La función de comparación se llama usando re, luego dentro del paréntesis el primer argumento es el patrón que se va a comparar, y entonces tendrá la cadena dada desde la que se comparará el patrón y también se le pasa un valor de bandera. Aquí re.I es el valor flag que significa IGNORECASE, por lo que se ignorará si el patrón y la cadena tienen letras mayúsculas o minúsculas diferentes.

La salida es :

Hello

En este ejemplo, se utiliza el prefijo r que indica que la cadena es una cadena sin procesar. En una cadena sin procesar no hay necesidad de escribir barras dobles cuando se usan secuencias de escape, por ejemplo, si quiere una barra invertida, entonces sólo tiene una simple \ pero no dobles barras invertidas \\ como las que tenía en las cadenas normales. Esta es la única diferencia entre una cadena normal y una cadena sin procesar.

Usando la función re.match con una cadena regular

Considere el siguiente ejemplo en el que se utiliza una cadena regular en lugar de una cadena sin procesar:

import re

str = "\\tHello Python Programming"
mobj = re.match("\\thello", str, re.I)  # no match

str = "\tHello Python Programming"
mobj = re.match("\\thello", str, re.I)  # \thello is matching

Expresión regular de Python re.search() function

Puede utilizar la función re.search() para buscar el patrón RE en el string dado. La función search contiene tres argumentos en la función el patrón, dada cadena, y banderas (opcional) respectivamente.

La siguiente es la sintaxis de la función de búsqueda en Python:

re.search(pattern, string, flags)

El siguiente código de Python demuestra el uso de la función search():

import re

str = "Hello Python Programming"
sobj = re.search(r"programming", str, re.I)
print(sobj.group())
Programming

En este código se está buscando la palabra programming. La función search busca en la cadena entera. La diferencia entre la búsqueda y la concordancia es que la función match sólo comprueba al principio de la cadena mientras que la función search busca en la cadena entera.

Búsqueda al principio usando re.search

Si desea buscar al principio de la cadena, puede utilizar ^. Considere el siguiente ejemplo:

import re

str = "Hello Python Programming"
sobj = re.search(r"^programming", str, re.I)
print(sobj.group())  # no match is found

sobj = re.search(r"^hello", str, re.I)
print(sobj.group())  # matching: Hello

Aquí ^ hará la búsqueda sólo al principio de la cadena.

Busque al final usando re.search

También puede buscar al final de la cadena dada. Se puede hacer usando $ al final del patrón. Considere el código de abajo:

import re

str = "Hello Python Programming"
sobj = re.search(r"programming$", str, re.I)
print(sobj.group())  # matching: Programming

sobj = re.search(r"hello$", str, re.I)
print(sobj.group())  # no match found

Compilando expresiones regulares con re.complie

Las expresiones regulares en Python cuando se compilan se convierten en patrones. Estos patrones son en realidad los objetos de los patrones que contienen diferentes funciones para realizar diferentes tareas que pueden incluir la búsqueda, la coincidencia y el reemplazo, etc.

Cuando compilas un patrón, puedes utilizarlo más tarde en el programa.

Uso de patrones precompilados

Considere el código que se muestra a continuación en el que se compila el patrón r"\d" que significa el primer dígito de la cadena y luego se utiliza este patrón para llamar a la función de búsqueda y se pasa una cadena en la función de búsqueda. Este patrón se buscará en la cadena proporcionada a la función de búsqueda. De forma similar, puede utilizar este patrón precompilado con la función de búsqueda como se indica a continuación:

import re

compPat = re.compile(r"(\d)")
sobj = compPat.search("Lalalala 123")
print(mobj.group())

mobj = compPat.match("234Lalalala 123456789")
print(mobj.group())
1
2

Banderas en el módulo re de expresión regular de Python

Puedes usar Flags are para cambiar el comportamiento de una expresión regular. En una función, las marcas son opcionales. Puede usar flags de dos maneras diferentes, ya sea usando la palabra clave flags y asignándole un valor de flag o escribiendo directamente el valor del flag. Puede tener más de un valor de flag en el literal RE; esto puede hacerse usando el operador OR de bits |.

Considere la siguiente tabla en la que se describen algunos de los flags comúnmente usados con los literales de la Expresión Regular:

Valor del indicador Descripción
re. I Este modificador ignorará el caso de las cadenas y los patrones mientras se realiza la comparación.
re.L Este modificador se usa para interpretar palabras con respecto a la localización actual.
re.M Este modificador se usa para hacer que $ coincida con el final de la línea y no con el final de la cadena. De forma similar, ^ coincidirá con el principio de la línea en lugar de con el principio de la cadena.
re.S Este modificador se usa para hacer un punto . para que coincida con cualquier carácter. Esto incluye también una nueva línea.
re.U Este modificador se usa para interpretar los caracteres como un conjunto de caracteres Unicode.
re.X Se usa para ignorar los espacios en blanco. Hará # como un marcador de comentario.

Uso de múltiples valores de bandera

Considere el siguiente código Python en el cual verá como usar valores de banderas múltiples para cambiar el comportamiento de RE. Los valores de banderas múltiples pueden ser incluidos por el operador bitwise OR (|):

import re

s = re.search("L", "Hello")
print(s)  # Output: None, L is there but in small letter and we didn't use flags

s = re.search("L", "Hello", re.I)
print(s)  # Output: 1

s = re.search("L", "^Hello", re.I | re.M)
print(s)  # Output: 1, searching will be made from the start of line and case is ignored

Comprobación de caracteres permitidos

También puede comprobar si una determinada cadena contiene algún rango de caracteres en particular o no.

Definición de una función y verificación de los caracteres permitidos

Considere el siguiente ejemplo en el que se define una función y también se utiliza un patrón precompilado para comprobar si los caracteres determinados están en la cadena pasada o no:

import re


def check(str):
    s = re.compile(r"[^A-Z]")
    str = s.search(str)
    return not bool(str)


print(check("HELLOPYTHON"))  # Output: True
print(check("hellopython"))  # Output: False

En esta función, un patrón que es r '[^A-Z]' es compilado y usado para buscar en una cadena pasada cuando esta función llamada check es llamada. Esta función comprueba si la cadena pasada contiene las letras A-Z (mayúsculas) o no. De forma similar, se puede ver que cuando se pasa una cadena en minúsculas se devuelve false.

Busque y reemplace

El módulo re proporciona una función que es una función sub que se usa para reemplazar todas las ocurrencias del pattern en la string dada, usando el atributo repl en la función. Los caracteres serán reemplazados hasta que se alcance el número count. La función sub devolverá la cadena actualizada.

La siguiente es la sintaxis de la subfunción:

re.sub(pattern, repl, string, count=0)

Usando la función sub

Considere el siguiente ejemplo en el que la función sub reemplaza la cadena entera con una cadena dada:

import re

s = "Playing 4 hours a day"
obj = re.sub(r"^.*$", "Working", s)
print(obj)
Working

Aquí, se usa la función sub. El patrón r'^.*$ significa comenzar desde el principio de la cadena y luego .* significa lo que sea que esté en la cadena hasta el final $ de la misma. Entonces el argumento "Working" reemplazará a la cadena entera s.

Usando la función sub para borrar todos los dígitos de una cadena

Considere el siguiente ejemplo en el que la función sub borra los dígitos en la cadena dada. Para este propósito puedes usar \d:

import re

s = "768 Working 2343 789 five 234 656 hours 324 4646 a 345 day"
obj = re.sub(r"\d", "", s)
print(obj)
Working   five   hours   a  day

De manera similar, puede borrar los caracteres de la cadena. Para este propósito puede usar \D.

import re

s = "768 Working 2343 789 five 234 656 hours 324 4646 a 345 day"
obj = re.sub(r"\D", "", s)
print(obj)
76823437892346563244646345

La función findall()

La función findall devuelve una lista de todas las cadenas que coinciden con el patrón. La diferencia entre las funciones search y findall es que la primera encuentra todas las coincidencias, mientras que la segunda sólo encuentra la primera. Esta función encuentra las coincidencias que no se superponen y las devuelve como una lista de cadenas.

La siguiente es la sintaxis de la función findall:

findall(pattern, string, flags)

Aquí el pattern es el patrón RE que encontrarás en una string dada con algunos valores de flags, por ejemplo re.I para ignorar el caso.

Encuentra todas las coincidencias no solapadas

En el siguiente ejemplo, findall encuentra coincidencias que no se solapan:

import re

str = "Working 6 hours a day. Studying 4 hours a day."
mobj = re.findall(r"[0-9]", str)
print(mobj)
["6", "4"]

r'[0-9]' is a pattern finding all the digits in the given string and a list of strings is returned (no matter they are digits) which is stored in mobj.

findall con los archivos

También puedes usar findall para buscar en un archivo. Cuando utilice findall con un archivo, le devolverá una lista de todas las cadenas que coincidan con el archivo. Se usará la función read() del fichero, así que no tiene que iterar a través de cada línea del fichero usando un bucle, ya que devuelve el texto completo del fichero como una cadena. Considere el siguiente ejemplo:

import re

file = open("asd.txt", "r")
mobj = re.findall(r"arg.", file.read())
print(mobj)
file.close()
["arg,", "arg,", "arg,", "argv", "argv", "argv"]

En este ejemplo, el archivo se abre primero en modo de lectura. El patrón r'arg.' coincide con el contenido del fichero y tiene la lista de cadenas que coinciden en la salida.

La función finditer()

La función finditer() puede ser usada para encontrar el patrón RE en las cadenas junto con la ubicación de las cadenas que coinciden, que es el índice de las cadenas. Esta función realmente itera a través de las cadenas que coinciden y devuelve los índices o las ubicaciones de la cadena.

La siguiente es la sintaxis de la función finditer:

finditer(pattern, string, flags)

Iteración sobre las coincidencias

La única diferencia entre findall y finditer es que finditer devuelve el índice también junto con las cadenas que coinciden. En el código de abajo, finditer se usa para encontrar las ubicaciones de las cadenas que coinciden mientras se itera sobre las coincidencias (cadenas que coinciden) usando para el bucle.

import re

str = "Working 6 hours a day. Studying 4 hours a day."
pat = r"[0-9]"
for mobj in re.finditer(pat, str):
    s = mobj.start()
    e = mobj.end()
    g = mobj.group()
    print("{} found at location [{},{}]".format(g, s, e))
6 found at location [8,9]
4 found at location [32,33]

En este ejemplo, el patrón son los dígitos del 0 al 9 que se encuentran en str. El bucle for itera sobre las cadenas coincidentes devueltas por finditer. En el bucle, las funciones start, end y group devuelven el índice inicial, el índice final y la coincidencia encontrada respectivamente en cada iteración de la cadena devuelta por finditer.

La función split()

La función split se utiliza para dividir una cadena.

A continuación se muestra la sintaxis de la función split:

split(patter, string, maxsplit, flags)

Aquí max es el número total de divisiones de cadenas. Si como mucho se producen divisiones maxsplit, el resto de la cadena se devuelve como elemento final de la lista. El valor por defecto de max es 0, lo que significa que las divisiones son ilimitadas.

Dividir un string

La función split devuelve cada palabra de una cadena

En el código que se muestra a continuación, un string se divide según el patrón y el número de divisiones máximas dados.

import re

str = "Birds fly high in the sky for ever"
mobj = re.split("\s+", str, 5)
print(mobj)
["Birds", "fly", "high", "in", "the", "sky for ever"]

En este ejemplo, el carácter de patrón s es un carácter especial que coincide con el carácter de espacio en blanco, que es equivalente a [ \t\n\r\f\v]. Por lo tanto, podría tener palabras separadas. El valor de max es 5 aquí lo que hace que 6 se separe, y el último elemento es el resto de la cadena después de la 5ª separación.

Los patrones básicos de re

Las expresiones regulares pueden especificar patrones que se comparan con cadenas dadas. Los siguientes son los patrones básicos de la expresión regular:

Patrón Descripción
^ Se utiliza para emparejar al principio de la cadena.
$ Este patrón coincidirá al final de la cadena.
. El punto se usa para que coincida con un carácter (no se incluye la nueva línea).
[...] Se utiliza para hacer coincidir un solo carácter entre corchetes.
[^...] Se usa para coincidir con un solo carácter pero no entre corchetes.
* 0 o más ocurrencias de re precedentes en una cadena dada.
+ 1 o más ocurrencias de re precedentes en una cadena dada.
? 0 o 1 ocurrencias de re precedentes en una cadena dada.
{n} Coincidirá con n número de ocurrencias en una cadena dada.
{n,} Se corresponderá con n o más de n número de ocurrencias.
{n, m} Este patrón se utiliza para hacer coincidir al menos n y como máximo m coincidencias en la cadena de caracteres.
`a b`
(re) Este patrón se utiliza para agrupar las expresiones regulares y recordará el texto emparejado.
(?imx) Se activará temporalmente en i o m o x en RE. Cuando se usan paréntesis, sólo se afecta el área de los paréntesis.
(?-imx) Se desactivará temporalmente i o m o x en RE. Cuando se usan paréntesis, sólo se afecta el área de los paréntesis.
(?: re) Este patrón se utiliza para agrupar las expresiones regulares pero no recordará el texto emparejado.
(?imx: re) Se conmutará temporalmente en i o m o x en RE dentro del paréntesis.
(?-imx: re) Temporalmente se desactivará i o m o x en RE dentro del paréntesis.
(?#...) Es un comentario.
(?= re) Se utiliza para especificar la posición mediante un patrón. No tiene ningún rango.
(?! re) Se utiliza para especificar la posición mediante una negación del patrón. No tiene ningún rango.
(?> re) Este patrón se utiliza para hacer coincidir el patrón independiente.
\w Este patrón se utiliza para hacer coincidir las palabras.
\W Este patrón se utiliza para hacer coincidir las no-palabras.
\s Coincidirá con los espacios en blanco. \es igual a la de la familia.
\S Coincidirá con los espacios no-blancos.
\d igual a 0-9. Coincide con los dígitos de la cadena.
\D Coincide con los no-dígitos.
\A coinciden con el principio de la cadena.
\Z coinciden con el final de la cadena. Y si hay alguna línea nueva, coincidirá antes de la línea nueva.
\G …hasta el punto de que el último partido se terminó.
\b coinciden con los límites de la palabra cuando está fuera de los corchetes pero cuando está dentro de los corchetes coincidirá con el retroceso.
\B coinciden con los límites de las no-palabras.
n, t, etc. ...se usa para hacer coincidir las nuevas líneas, coincidirá con la pestaña y así sucesivamente.
\1...\9 Este patrón coincidirá con la enésima subexpresión (agrupada).
\10 \10 suele coincidir con la enésima subexpresión (agrupada) si la coincidencia ya está hecha. Si la coincidencia no está ya hecha, \10 proporcionará una representación octal de un código de carácter.

Casos de repetición

La siguiente tabla muestra algunos ejemplos de casos de repetición con descripción:

Ejemplos Descripciones
ab? Coincidirá con la a o la ab.
ab* ab* coincidirá con ab y a y cualquier a seguida de cualquier b.
ab+ ab+ significa a seguido de b y no sólo a. a debe ser seguido por no cero b.
\d{2} Coincidirá exactamente con 2 dígitos.
\d{2,} Coincidirá con 2 o más dígitos.
\d{2,4} Coincidirá con los dígitos 2, 3 y 4.

Repetición de la no-repetición

En las expresiones regulares, la repetición es, por defecto, codiciosa y trata de igualar el mayor número de repeticiones posible.

Los calificativos como *, + y ? son calificativos codiciosos. Cuando utilice .*, realizará una coincidencia codiciosa y coincidirá con toda la cadena, lo que hará que coincidan tantos caracteres como sea posible. Considere el código que se muestra a continuación:

import re

mobj = re.match(r".*", "Birds fly high in sky")
print(mobj.group())
Birds fly high in the sky

Así que puede ver aquí que la cadena entera es igualada.

Cuando añada ? con .+ tendrá un re no codicioso y el patrón .+? coincidirá con el menor número de caracteres posible en la cadena.

import re

mobj = re.match(r".*", "Birds fly high in sky")
print(mobj.group())

El resultado es el primer carácter de la cadena

B

Caracteres y secuencias especiales en re

Los caracteres especiales en re empiezan con una \. Por ejemplo, tenemos \A que coincidirá con el principio de la cadena.

Estos caracteres especiales se describen en la tabla anterior.

En esta sección, se le mostrarán los ejemplos de algunos de los caracteres especiales:

import re

str = "Birds fly high in the sky"
# \A
# OUTPUT: B, here \A will match at beginning only.
mobj = re.match(r"\Ab", str, re.I)

# \d
mobj = re.match(r"\d", "4 birds are flying")  # OUTPUT: 4

# \s
mobj = re.split("\s+", "birds fly high in the sky", 1)  # OUTPUT: ['Birds', 'fly']

La función escape

La función escape se utiliza para escapar todos los caracteres de la cadena. Las letras ASCII, los números y _ no se escaparán. La función escape se utiliza cuando se desea extraer los metacaracteres de una cadena.

A continuación se muestra la sintaxis de la función escape:

escape(pattern)

En el siguiente ejemplo, una cadena www.python.org se pasa a la función de escape. En esto tenemos . que es un metacaracter y será extraído o emparejado:

print(re.escape("www.python.org"))
www\.python\.org

Aquí . es un metacaracter que es extraído o emparejado. Siempre que un metacaracter se empareje usando la función de escape tendrá \ antes del caracter.

Escapar de caracteres especiales

Los caracteres como los corchetes [ y ] no se pueden emparejar. Considere el siguiente ejemplo:

import re

mobj = re.search(r"[a]", "[a]b")
print(mobj.group())
a

Aquí puede ver que los corchetes [ y ] no coinciden.

Puede hacerlos coincidir usando la función de escape:

import re

mobj = re.search(r"\[a\]", "[a]b")
print(mobj.group())
[a]b

La función group()

La función group se utiliza para devolver uno o más subgrupos de la coincidencia encontrada. La función group puede tener algunos argumentos.

La siguiente es la sintaxis de la función group:

group(group1, group2, ..., groupN)

Si tiene un solo argumento en la función de grupo, el resultado será una sola cadena, pero cuando tiene más de un argumento, entonces el resultado será una tupla (que contiene un elemento por argumento).

Cuando no hay ningún argumento, por defecto el argumento será cero y devolverá la totalidad de la coincidencia.

Cuando el argumento groupN es cero, el valor de retorno será la cadena entera que coincida.

Cuando especifique el número de grupo o el argumento como un valor negativo o un valor más grande que el número de grupos en el patrón, entonces ocurrirá una excepción IndexError.

Considere el código de abajo en el que no hay ningún argumento en la función group que sea equivalente a group(0).

import re

str = "Working 6 hours a day"
mobj = re.match(r"^.*", str)
print(mobj.group())
Working 6 hours a day

Aquí se usa group() y se tiene la cadena completa de la coincidencia.

Picking de partes de textos coincidentes

En el siguiente ejemplo, la función group se utiliza con argumentos para recoger los grupos que coinciden:

import re

a = re.compile("(p(q)r)s")
b = a.match("pqrs")
print(b.group(0))
print(b.group(1))
print(b.group(2))
pqrs
pqr
q

Aquí group(0) devuelve la coincidencia completa. group(1) devolverá la primera coincidencia que es pqr y group(2) devolverá la segunda coincidencia que es q.

Grupos nombrados

Utilizando grupos con nombre, puede crear un grupo de captura. Este grupo puede ser referido por el nombre entonces. Considere el siguiente ejemplo:

import re

mobj = re.search(r"Hi (?P<name>\w+)", "Hi Roger")
print(mobj.group("name"))
Roger

Grupos no capturadores

El grupo no capturador puede ser creado usando ?:. El grupo no capturador se usa cuando no quiere el contenido del grupo.

import re

mobj = re.match("(?:[pqr])+", "pqr")
print(mobj.groups())
()
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook