Expresiones regulares de Python

Una expresión regular es una secuencia especial de caracteres que te ayuda a comprobar fácilmente si una cadena coincide con algún patrón.

Desde la versión 1.5, Python añadió el módulo re, que proporciona patrones de expresiones regulares de estilo Perl.

El módulo re dota al lenguaje Python de todas las funcionalidades de las expresiones regulares.

La función compile genera un objeto de expresión regular a partir de una cadena de patrón y un parámetro de banderas opcional. Este objeto posee una serie de métodos para la coincidencia y el reemplazo de expresiones regulares.

El módulo re también proporciona funciones completamente equivalentes a estos métodos, las cuales usan una cadena de patrón como su primer parámetro.

Este capítulo presenta principalmente las funciones de procesamiento de expresiones regulares más utilizadas en Python.


Función re.match

re.match intenta hacer coincidir un patrón desde la posición inicial de la cadena. Si la coincidencia no se logra desde la posición inicial, match() retorna None.

Sintaxis de la función:

re.match(pattern, string, flags=0)

Descripción de los parámetros de la función:

ParámetroDescripción
patternLa expresión regular a coincidir.
stringLa cadena a comparar.
flagsBanderas, usadas para controlar el modo de coincidencia de la expresión regular, como: distinguir entre mayúsculas y minúsculas, coincidencia multilínea, etc. Ver:Modificadores de expresiones regulares - Banderas opcionales

Si la coincidencia es exitosa, el método re.match retorna un objeto de coincidencia; de lo contrario retorna None.

Podemos usar group(num) o groups() como funciones del objeto de coincidencia para obtener la expresión coincidente.

Métodos del objeto de coincidenciaDescripción
group(num=0)La cadena de toda la expresión coincidente; group() puede recibir varios números de grupo a la vez, en cuyo caso retorna una tupla con los valores correspondientes a esos grupos.
groups()Retorna una tupla que contiene todas las cadenas de los subgrupos, desde 1 hasta el número de subgrupos incluidos.

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.match('www', 'www.example.com').span()) # Coincide en la posición inicial print(re.match('com', 'www.example.com')) # No coincide en la posición inicial

La salida del ejemplo anterior es:

(0, 3)
None

Ejemplo

#!/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!"

El resultado de ejecución del ejemplo anterior es el siguiente:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

Método re.search

re.search escanea toda la cadena y retorna la primera coincidencia exitosa.

Sintaxis de la función:

re.search(pattern, string, flags=0)

Descripción de los parámetros de la función:

ParámetroDescripción
patternLa expresión regular a coincidir.
stringLa cadena a comparar.
flagsBanderas, usadas para controlar el modo de coincidencia de la expresión regular, como: distinguir entre mayúsculas y minúsculas, coincidencia multilínea, etc.

Si la coincidencia es exitosa, el método re.search retorna un objeto de coincidencia; de lo contrario retorna None.

Podemos usar group(num) o groups() como funciones del objeto de coincidencia para obtener la expresión coincidente.

Métodos del objeto de coincidenciaDescripción
group(num=0)La cadena de toda la expresión coincidente; group() puede recibir varios números de grupo a la vez, en cuyo caso retorna una tupla con los valores correspondientes a esos grupos.
groups()Retorna una tupla que contiene todas las cadenas de los subgrupos, desde 1 hasta el número de subgrupos incluidos.

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.search('www', 'www.example.com').span()) # Coincide en la posición inicial print(re.search('com', 'www.example.com').span()) # No coincide en la posición inicial

La salida del ejemplo anterior es:

(0, 3)
(11, 14)

Ejemplo

#!/usr/bin/python import re line = "Cats are smarter than dogs"; searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) if searchObj: print "searchObj.group() : ", searchObj.group() print "searchObj.group(1) : ", searchObj.group(1) print "searchObj.group(2) : ", searchObj.group(2) else: print "Nothing found!!"
El resultado de ejecución del ejemplo anterior es el siguiente:
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

Diferencia entre re.match y re.search

re.match solo coincide con el inicio de la cadena; si el inicio de la cadena no cumple la expresión regular, la coincidencia falla y la función retorna None. En cambio, re.search escanea toda la cadena hasta encontrar una coincidencia.

Ejemplo

#!/usr/bin/python import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print "match --> matchObj.group() : ", matchObj.group() else: print "No match!!" matchObj = re.search( r'dogs', line, re.M|re.I) if matchObj: print "search --> searchObj.group() : ", matchObj.group() else: print "No match!!"
El resultado de ejecución del ejemplo anterior es:
No match!!
search --> searchObj.group() :  dogs

Búsqueda y reemplazo

El módulo re de Python proporciona re.sub para reemplazar las coincidencias en una cadena.

Sintaxis:

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

Parámetros:

  • pattern: la cadena de patrón en la expresión regular.
  • repl: la cadena de reemplazo, también puede ser una función.
  • string: la cadena original en la que se buscará y reemplazará.
  • count: el número máximo de reemplazos después de la coincidencia del patrón; por defecto 0 significa reemplazar todas las coincidencias.

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- import re phone = "2004-959-559 # Este es un número de teléfono extranjero" # Eliminar los comentarios de Python en la cadena num = re.sub(r'#.*$', "", phone) print "El número de teléfono es:", num # Eliminar los caracteres no numéricos (-) de la cadena num = re.sub(r'\D', "", phone) print "El número de teléfono es:", num
El resultado de ejecución del ejemplo anterior es el siguiente:
电话号码是:  2004-959-559 
电话号码是 :  2004959559

El parámetro repl es una función

En el siguiente ejemplo, los dígitos coincidentes en la cadena se multiplican por 2:

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- import re # Multiplicar por 2 los dígitos coincidentes def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))

La salida de la ejecución es:

A46G8HFD1134

Función re.compile

La función compile se utiliza para compilar una expresión regular y generar un objeto de expresión regular (Pattern), que puede ser usado por funciones como match(), search() y findall.

El formato de sintaxis es:

re.compile(pattern[, flags])

Parámetros:

  • pattern: una expresión regular en forma de cadena.

  • flags: opcional, indica el modo de coincidencia, como ignorar mayúsculas/minúsculas, modo multilínea, etc. Los parámetros específicos son:

    1. re.IIgnorar mayúsculas y minúsculas
    2. re.LIndica que los conjuntos de caracteres especiales \w, \W, \b, \B, \s, \S dependen del entorno actual.
    3. re.MModo multilínea
    4. re.SEs decir,.Y cualquier carácter, incluyendo saltos de línea (.no incluye saltos de línea)
    5. re.UIndica que los conjuntos de caracteres especiales \w, \W, \b, \B, \d, \D, \s, \S dependen de la base de datos de propiedades de caracteres Unicode.
    6. re.XPara aumentar la legibilidad, ignora los espacios y#los comentarios posteriores.

Ejemplo

Ejemplo

>>>import re >>> pattern = re.compile(r'\d+') # Se usa para hacer coincidir al menos un dígito >>> m = pattern.match('one12twothree34four') # Busca al inicio, no hay coincidencia >>> print m None >>> m = pattern.match('one12twothree34four', 2, 10) # Comienza a coincidir desde la posición de 'e', no hay coincidencia >>> print m None >>> m = pattern.match('one12twothree34four', 3, 10) # Comienza a coincidir desde la posición de '1', coincide exactamente >>> print m # Retorna un objeto Match <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # Se puede omitir 0 '12' >>> m.start(0) # Se puede omitir 0 3 >>> m.end(0) # Se puede omitir 0 5 >>> m.span(0) # Se puede omitir 0 (3, 5)

Arriba, cuando la coincidencia es exitosa se retorna un objeto Match, donde:

  • group([group1, …])El método se usa para obtener la cadena de una o más coincidencias de grupo; cuando se quiere obtener la subcadena completa coincidente, se puede usar directamente.group()ogroup(0);
  • start([group])El método se usa para obtener la posición inicial de la subcadena coincidente del grupo en toda la cadena (índice del primer carácter de la subcadena), con valor predeterminado 0.
  • end([group])El método se usa para obtener la posición final de la subcadena coincidente del grupo en toda la cadena (índice del último carácter de la subcadena + 1), con valor predeterminado 0.
  • span([group])El método retorna(start(group), end(group))。

Veamos otro ejemplo:

Ejemplo

>>>import re >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I indica ignorar mayúsculas y minúsculas >>> m = pattern.match('Hello World Wide Web') >>> print m # Coincidencia exitosa, retorna un objeto Match <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # Retorna toda la subcadena coincidente 'Hello World' >>> m.span(0) # Retorna el índice de toda la subcadena coincidente (0, 11) >>> m.group(1) # Retorna la subcadena coincidente del primer grupo 'Hello' >>> m.span(1) # Retorna el índice de la subcadena coincidente del primer grupo (0, 5) >>> m.group(2) # Retorna la subcadena coincidente del segundo grupo 'World' >>> m.span(2) # Retorna la subcadena coincidente del segundo grupo (6, 11) >>> m.groups() # Equivale a (m.group(1), m.group(2), ...) ('Hello', 'World') >>> m.group(3) # No existe el tercer grupo Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: no such group

findall

Encuentra todas las subcadenas que coinciden con la expresión regular en la cadena y devuelve una lista. Si hay múltiples patrones de coincidencia, devuelve una lista de tuplas. Si no se encuentra ninguna coincidencia, devuelve una lista vacía.

Nota:match y search coinciden una vez, findall coincide con todas.

El formato de sintaxis es:

findall(string[, pos[, endpos]])

Parámetros:

  • string: La cadena que se va a comparar.
  • pos: Parámetro opcional, especifica la posición inicial de la cadena, por defecto es 0.
  • endpos: Parámetro opcional, especifica la posición final de la cadena, por defecto es la longitud de la cadena.

Buscar todos los números en la cadena:

Ejemplo

# -*- coding:UTF8 -*- import re pattern = re.compile(r'\d+') # Buscar números result1 = pattern.findall('ejemplo 123 google 456') result2 = pattern.findall('run88oob123google456', 0, 10) print(result1) print(result2)

Resultado de salida:

['123', '456']
['88', '12']

Múltiples patrones de coincidencia, devuelve una lista de tuplas:

Ejemplo

import re

result = re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
print(result)
[('width', '20'), ('height', '10')]

re.finditer

Similar a findall, encuentra todas las subcadenas que coinciden con la expresión regular en la cadena y las devuelve como un iterador.

re.finditer(pattern, string, flags=0)

Parámetros:

ParámetroDescripción
patternExpresión regular de coincidencia
stringLa cadena a comparar.
flagsIndicador, se utiliza para controlar el modo de coincidencia de la expresión regular, como: si se distingue entre mayúsculas y minúsculas, coincidencia multilínea, etc. Consulte:Modificadores de expresiones regulares - Indicadores opcionales

Ejemplo

# -*- coding: UTF-8 -*- import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() )

Resultado de salida:

12 
32 
43 
3

re.split

El método split divide la cadena según las subcadenas que coinciden y devuelve una lista. Su forma de uso es la siguiente:

re.split(pattern, string[, maxsplit=0, flags=0])

Parámetros:

ParámetroDescripción
patternExpresión regular de coincidencia
stringLa cadena a comparar.
maxsplitNúmero de divisiones, maxsplit=1 divide una vez, por defecto es 0, sin límite de veces.
flagsIndicador, se utiliza para controlar el modo de coincidencia de la expresión regular, como: si se distingue entre mayúsculas y minúsculas, coincidencia multilínea, etc. Consulte:Modificadores de expresiones regulares - Indicadores opcionales

Ejemplo

>>>import re >>> re.split('\W+', 'ejemplo, ejemplo, ejemplo.') ['ejemplo', 'ejemplo', 'ejemplo', ''] >>> re.split('(\W+)', ' ejemplo, ejemplo, ejemplo.') ['', ' ', 'ejemplo', ', ', 'ejemplo', ', ', 'ejemplo', '.', ''] >>> re.split('\W+', ' ejemplo, ejemplo, ejemplo.', 1) ['', 'ejemplo, ejemplo, ejemplo.'] >>> re.split('a*', 'hello world') # Para una cadena que no encuentra coincidencia, split no la dividirá ['hello world']

Objeto de expresión regular

re.RegexObject

re.compile() devuelve un objeto RegexObject.

re.MatchObject

group() devuelve la cadena que coincide con la RE.

  • start()Devuelve la posición inicial de la coincidencia
  • end()Devuelve la posición final de la coincidencia
  • span()Devuelve una tupla que contiene las posiciones (inicio, fin) de la coincidencia

Modificadores de expresiones regulares - Banderas opcionales

Las expresiones regulares pueden incluir algunos indicadores opcionales para controlar el modo de coincidencia. Los modificadores se especifican como un indicador opcional. Se pueden especificar múltiples indicadores mediante OR bit a bit (|). Por ejemplo, re.I | re.M establece los indicadores I y M:

ModificadorDescripción
re.IHace que la coincidencia no distinga entre mayúsculas y minúsculas
re.LRealiza una coincidencia con reconocimiento de localización (locale-aware)
re.MCoincidencia multilínea, afecta a ^ y $
re.SHace que . coincida con todos los caracteres, incluidos los saltos de línea
re.UAnaliza los caracteres según el conjunto de caracteres Unicode. Este indicador afecta a \w, \W, \b, \B.
re.XEste indicador te da un formato más flexible para que puedas escribir expresiones regulares más fáciles de entender.

Patrones de expresiones regulares

Las cadenas de patrón utilizan una sintaxis especial para representar una expresión regular:

Las letras y los números representan su propio valor. Las letras y números en un patrón de expresión regular coinciden con las mismas cadenas.

La mayoría de las letras y números precedidos por una barra invertida tienen un significado diferente.

Los signos de puntuación solo coinciden consigo mismos cuando se escapan; de lo contrario, representan un significado especial.

La barra invertida en sí misma necesita ser escapada con una barra invertida.

Dado que las expresiones regulares suelen contener barras invertidas, es mejor usar cadenas sin procesar (raw strings) para representarlas. Los elementos de patrón (como r'\t', equivalente a '\\t') coinciden con los caracteres especiales correspondientes.

La siguiente tabla enumera los elementos especiales de la sintaxis de patrones de expresiones regulares. Si proporcionas parámetros de indicadores opcionales al usar el patrón, el significado de algunos elementos del patrón cambiará.

PatrónDescripción
^Coincide con el inicio de la cadena
$Coincide con el final de la cadena.
.Coincide con cualquier carácter, excepto los saltos de línea. Cuando se especifica el indicador re.DOTALL, puede coincidir con cualquier carácter, incluidos los saltos de línea.
[...]Se utiliza para representar un conjunto de caracteres, listados individualmente: [amk] coincide con 'a', 'm' o 'k'
[^...]Caracteres que no están en []: [^abc] coincide con cualquier carácter excepto a, b, c.
re*Coincide con 0 o más repeticiones de la expresión.
re+Coincide con 1 o más repeticiones de la expresión.
re?Coincide con 0 o 1 fragmento definido por la expresión regular anterior, de forma no codiciosa
re{ n}Coincide exactamente con n de la expresión anterior. Por ejemplo,o{2}no puede coincidir con la "o" en "Bob", pero puede coincidir con las dos o en "food".
re{ n,}Coincide con n o más de la expresión anterior. Por ejemplo, o{2,} no puede coincidir con la "o" en "Bob", pero puede coincidir con todas las o en "foooood". "o{1,}" es equivalente a "o+". "o{0,}" es equivalente a "o*".
re{ n, m}Coincide de n a m veces el fragmento definido por la expresión regular anterior, de forma codiciosa
a| bCoincide con a o b
(re)Agrupa la expresión regular y recuerda el texto coincidente
(?imx)La expresión regular contiene tres indicadores opcionales: i, m o x. Solo afecta a la región dentro de los paréntesis.
(?-imx)La expresión regular desactiva los indicadores opcionales i, m o x. Solo afecta a la región dentro de los paréntesis.
(?: re)Similar a (...), pero no representa un grupo
(?imx: re)Usa los indicadores opcionales i, m o x dentro de los paréntesis
(?-imx: re)No usa los indicadores opcionales i, m o x dentro de los paréntesis
(?#...)Comentario.
(?= re)Aserción de anticipación positiva. Si la expresión regular contenida, representada por ..., coincide exitosamente en la posición actual, tiene éxito; de lo contrario, falla. Pero una vez que la expresión contenida ha sido probada, el motor de coincidencia no avanza en absoluto; el resto del patrón aún debe intentar el lado derecho del delimitador.
(?! re)Aserción de anticipación negativa. Es lo contrario de la aserción positiva; tiene éxito cuando la expresión contenida no puede coincidir en la posición actual de la cadena.
(?> re)Patrón independiente que coincide sin retroceso (backtracking).
\wCoincide con letras, números y guiones bajos
\WCoincide con cualquier carácter que no sea letra, número ni guion bajo
\sCoincide con cualquier carácter de espacio en blanco, equivalente a[ \t\n\r\f]。
\SCoincide con cualquier carácter que no sea espacio en blanco
\dCoincide con cualquier dígito, equivalente a [0-9].
\DCoincide con cualquier carácter que no sea un dígito
\ACoincide con el inicio de la cadena
\ZCoincide con el final de la cadena; si hay un salto de línea, solo coincide hasta el final de la cadena antes del salto de línea.
\zCoincide con el final de la cadena
\GCoincide con la posición donde finalizó la última coincidencia.
\bCoincide con un límite de palabra, es decir, la posición entre una palabra y un espacio. Por ejemplo, 'er\b' puede coincidir con 'er' en "never", pero no puede coincidir con 'er' en "verb".
\BCoincide con un límite que no es de palabra. 'er\B' puede coincidir con 'er' en "verb", pero no puede coincidir con 'er' en "never".
\n, \t, etc.Coincide con un salto de línea. Coincide con un tabulador. etc.
\1...\9Coincide con el contenido del enésimo grupo.
\10Coincide con el contenido del enésimo grupo, si ha coincidido. De lo contrario, se refiere a la expresión del código de carácter octal.

Ejemplos de expresiones regulares

Coincidencia de caracteres

EjemploDescripción
pythonCoincide con "python".

Clases de caracteres

EjemploDescripción
[Pp]ython Coincide con "Python" o "python"
rub[ye]Coincide con "ruby" o "rube"
[aeiou]Coincide con cualquier letra dentro de los corchetes
[0-9]Coincide con cualquier dígito. Similar a
[a-z]Coincide con cualquier letra minúscula
[A-Z]Coincide con cualquier letra mayúscula
[a-zA-Z0-9]Coincide con cualquier letra y dígito
[^aeiou]Todos los caracteres excepto las letras aeiou
[^0-9]Coincide con cualquier carácter excepto los dígitos

Clases de caracteres especiales

EjemploDescripción
.Coincide con cualquier carácter individual excepto "\n". Para coincidir con cualquier carácter, incluido '\n', use un patrón como '[.\n]'.
\dCoincide con un carácter de dígito. Equivalente a [0-9].
\D Coincide con un carácter que no es dígito. Equivalente a [^0-9].
\sCoincide con cualquier carácter de espacio en blanco, incluidos espacios, tabuladores, avances de página, etc. Equivalente a [ \f\n\r\t\v].
\S Coincide con cualquier carácter que no sea espacio en blanco. Equivalente a [^ \f\n\r\t\v].
\wCoincide con cualquier carácter de palabra, incluido el guion bajo. Equivalente a '[A-Za-z0-9_]'.
\WCoincide con cualquier carácter que no sea de palabra. Equivalente a '[^A-Za-z0-9_]'.
Otras extensiones