Python3 Expresiones Regulares

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.

En Python, se utilizareel módulo para procesar expresiones regulares.

El módulo re proporciona un conjunto de funciones que te permiten realizar operaciones de coincidencia de patrones, búsqueda y reemplazo en cadenas.

reEl módulo le proporciona al lenguaje Python una funcionalidad completa de expresiones regulares.

Este capítulo presenta principalmente las funciones de procesamiento de expresiones regulares más utilizadas en Python. Si no conoces las expresiones regulares, puedes consultar nuestroExpresiones regulares - Tutorial。


Función re.match

re.match intenta hacer coincidir un patrón desde el inicio de la cadena. Si no se logra una coincidencia en la posición inicial, match() devuelve 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 coincidir.
flagsBandera, utilizada para controlar el modo de coincidencia de la expresión regular, como: si distingue entre mayúsculas y minúsculas, coincidencia multilínea, etc. Ver:Modificadores de expresiones regulares - Banderas opcionales

Si la coincidencia es exitosare.matchel método devuelve un objeto de coincidencia, de lo contrario devuelveNone。

Podemos usargroup(num)ogroups()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 aceptar varios números de grupo a la vez; en ese caso devolverá una tupla con los valores correspondientes a esos grupos.
groups()Devuelve una tupla que contiene todas las cadenas de los subgrupos, desde 1 hasta el número de subgrupos incluidos.

Ejemplo

#!/usr/bin/python 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

El resultado de ejecutar el ejemplo anterior es:

(0, 3)
None

Ejemplo

#!/usr/bin/python3 import re line = "Cats are smarter than dogs" # .* indica que coincide con cualquier carácter único o múltiple excepto los saltos de línea (\n, \r) # (.*?) indica el modo "no codicioso", que solo guarda la primera subcadena coincidente 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 ejecutar el 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 devuelve 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 coincidir.
flagsBandera, utilizada para controlar el modo de coincidencia de la expresión regular, como: si distingue entre mayúsculas y minúsculas, coincidencia multilínea, etc. Ver:Modificadores de expresiones regulares - Banderas opcionales

Cuando la coincidencia es exitosa, el método re.search devuelve un objeto de coincidencia; de lo contrario, devuelve 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 aceptar varios números de grupo a la vez; en ese caso devolverá una tupla con los valores correspondientes a esos grupos.
groups()Devuelve una tupla que contiene todas las cadenas de los subgrupos, desde 1 hasta el número de subgrupos incluidos.

Ejemplo

#!/usr/bin/python3 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

El resultado de ejecutar el ejemplo anterior es:

(0, 3)
(11, 14)

Ejemplo

#!/usr/bin/python3 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 ejecutar el 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.matchSolo coincide con el inicio de la cadena. Si el inicio de la cadena no cumple con la expresión regular, la coincidencia falla y la función devuelve None, mientras quere.searchcoincide con toda la cadena hasta encontrar una coincidencia.

Ejemplo

#!/usr/bin/python3 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 --> matchObj.group() : ", matchObj.group()) else: print ("No match!!")
El resultado de ejecutar el ejemplo anterior es el siguiente:
No match!!
search --> matchObj.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 de la expresión regular.
  • repl : la cadena de reemplazo, también puede ser una función.
  • string : la cadena original que se va a 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.
  • flags : el modo de coincidencia utilizado en la compilación, en forma numérica.

Los primeros tres son parámetros obligatorios, los últimos dos son opcionales.

Ejemplo

#!/usr/bin/python3 import re phone = "2004-959-559 # Este es un número de teléfono" # Eliminar el comentario num = re.sub(r'#.*$', "", phone) print ("Número de teléfono :", num) # Eliminar el contenido no numérico num = re.sub(r'\D', "", phone) print ("Número de teléfono :", num)

El resultado de la 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 números coincidentes en la cadena se multiplican por 2:

Ejemplo

#!/usr/bin/python import re # Multiplicar el número coincidente por 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))

El resultado de la ejecución es:

A46G8HFD1134

Función compile

La función compile se utiliza para compilar expresiones regulares y generar un objeto de expresión regular (Pattern) para que lo usen las funciones match() y search().

El formato de sintaxis es:

re.compile(pattern[, flags])

Parámetros:

  • pattern : una expresión regular en forma de cadena
  • flags es opcional, indica el modo de coincidencia, como ignorar mayúsculas y minúsculas, modo multilínea, etc. Los parámetros específicos son:
    • re.IGNORECASE o re.I- Hace que la coincidencia no distinga entre mayúsculas y minúsculas
  • re.L indica que los conjuntos de caracteres especiales \w, \W, \b, \B, \s, \S dependen del entorno actual
  • re.MULTILINE o re.M - Modo multilínea, cambia el comportamiento de ^ y $ para que coincidan con el inicio y el final de cada línea de la cadena.
  • re.DOTALL o re.S - Hace que.coincida con cualquier carácter, incluidos los saltos de línea.
  • re.ASCII - Hace que \w, \W, \b, \B, \d, \D, \s, \S coincidan únicamente con caracteres ASCII.
  • re.VERBOSE o re.X - Ignora espacios y comentarios, lo que permite organizar expresiones regulares complejas de manera más clara.

Estas banderas se pueden usar por separado o combinarse mediante el operador OR bit a bit (|). Por ejemplo, re.IGNORECASE | re.MULTILINE indica que se habilitan al mismo tiempo ignorar mayúsculas/minúsculas y el modo multilínea.

Ejemplo

Ejemplo

>>>import re >>> pattern = re.compile(r'\d+') # Se utiliza para coincidir con al menos un dígito >>> m = pattern.match('one12twothree34four') # Buscar en el inicio, no hay coincidencia >>> print( m ) None >>> m = pattern.match('one12twothree34four', 2, 10) # Comenzar a coincidir desde la posición de 'e', no hay coincidencia >>> print( m ) None >>> m = pattern.match('one12twothree34four', 3, 10) # Comenzar a coincidir desde la posición de '1', coincide exactamente >>> print( m ) # Devuelve 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 devuelve un objeto Match, donde:

  • group([group1, …])El método se utiliza para obtener las cadenas coincidentes de uno o más grupos. Cuando se desea obtener toda la subcadena coincidente, se puede usar directamentegroup()ogroup(0);
  • start([group])El método se utiliza para obtener la posición inicial de la subcadena coincidente del grupo en toda la cadena (índice del primer carácter de la subcadena); el valor predeterminado del parámetro es 0;
  • end([group])El método se utiliza 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); el valor predeterminado del parámetro es 0;
  • span([group])El método devuelve(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/minúsculas >>> m = pattern.match('Hello World Wide Web') >>> print( m ) # Coincidencia exitosa, devuelve un objeto Match <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # Devuelve la subcadena completa que coincidió 'Hello World' >>> m.span(0) # Devuelve el índice de la subcadena completa que coincidió (0, 11) >>> m.group(1) # Devuelve la subcadena que coincide con el primer grupo 'Hello' >>> m.span(1) # Devuelve el índice de la subcadena que coincide con el primer grupo (0, 5) >>> m.group(2) # Devuelve la subcadena que coincide con el segundo grupo 'World' >>> m.span(2) # Devuelve el índice de la subcadena que coincide con el 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 encuentra coincidencias, devuelve una lista vacía.

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

El formato de sintaxis es:

re.findall(pattern, string, flags=0)
o 
pattern.findall(string[, pos[, endpos]])

Parámetros:

  • patternPatrón de coincidencia.
  • stringLa cadena a comparar.
  • posParámetro opcional, especifica la posición inicial de la cadena; por defecto es 0.
  • endposPará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

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

Resultado de salida:

['123', '456']
['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.
flagsBanderas, utilizadas para controlar el modo de coincidencia de la expresión regular, como: si distingue entre mayúsculas y minúsculas, coincidencia multilínea, etc. Ver:Modificadores de expresiones regulares - Banderas opcionales

Ejemplo

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.
flagsBanderas, utilizadas para controlar el modo de coincidencia de la expresión regular, como: si distingue entre mayúsculas y minúsculas, coincidencia multilínea, etc. Ver:Modificadores de expresiones regulares - Banderas 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 sin coincidencias, split no la divide ['hello world']

Objeto de expresión regular

re.RegexObject

re.compile() devuelve un objeto RegexObject.

re.MatchObject

group() devuelve la cadena coincidente 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 con las posiciones (inicio, fin) de la coincidencia

Modificadores de expresiones regulares - Banderas opcionales

Las expresiones regulares pueden incluir algunos modificadores de banderas opcionales para controlar el modo de coincidencia.

Las siguientes banderas se pueden usar por separado o combinadas mediante el OR bit a bit (|). Por ejemplo, re.IGNORECASE | re.MULTILINE indica que se habilitan simultáneamente el modo de ignorar mayúsculas y minúsculas y el modo multilínea.

ModificadorDescripciónEjemplo
re.IGNORECASE o re.IHace que la coincidencia no distinga entre mayúsculas y minúsculas
import re
pattern = re.compile(r'apple', flags=re.IGNORECASE)
result = pattern.match('Apple')
print(result.group())  # 输出: 'Apple'
re.MULTILINE o re.MCoincidencia multilínea, afecta^y$, haciendo que coincidan con el inicio y el final de cada línea de la cadena.
import re
pattern = re.compile(r'^\d+', flags=re.MULTILINE)
text = '123\n456\n789'
result = pattern.findall(text)
print(result)  # 输出: ['123', '456', '789']
re.DOTALL o re.S:Hacer.Coincide con cualquier carácter, incluido el carácter de nueva línea.
import re
pattern = re.compile(r'a.b', flags=re.DOTALL)
result = pattern.match('a\nb')
print(result.group())  # 输出: 'a\nb'
re.ASCIIHace que \w, \W, \b, \B, \d, \D, \s, \S coincidan solo con caracteres ASCII.
import re
pattern = re.compile(r'\w+', flags=re.ASCII)
result = pattern.match('Hello123')
print(result.group())  # 输出: 'Hello123'
re.VERBOSE o re.XIgnora espacios y comentarios, permitiendo organizar expresiones regulares complejas de forma más clara.
import re
pattern = re.compile(r'''
    \d+  # 匹配数字
    [a-z]+  # 匹配小写字母
''', flags=re.VERBOSE)
result = pattern.match('123abc')
print(result.group())  # 输出: '123abc'

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 a sí mismos. 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 adquieren significados diferentes.

Los signos de puntuación solo coinciden consigo mismos cuando están escapados; de lo contrario, representan significados especiales.

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 para representarlas. Los elementos de patrón (comor'\t', equivalente a\\t) coinciden con el carácter especial correspondiente.

La siguiente tabla enumera los elementos especiales de la sintaxis de patrones de expresiones regulares. Si proporcionas parámetros de banderas opcionales junto con 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 el carácter de nueva línea; cuando se especifica la bandera re.DOTALL, puede coincidir con cualquier carácter, incluido el de nueva línea.
[...]Se utiliza para coincidir con cualquiera de los caracteres contenidos, por ejemplo, [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 con n repeticiones de la expresión anterior. Por ejemplo, "o{2}" no coincide con la "o" en "Bob", pero sí con las dos "o" en "food".
re{ n,}Coincide con n o más repeticiones de la expresión anterior. Por ejemplo, "o{2,}" no coincide con la "o" en "Bob", pero coincide con todas las "o" en "foooood". "o{1,}" equivale a "o+". "o{0,}" equivale 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)Coincide con la expresión entre paréntesis y también representa un grupo
(?imx)La expresión regular incluye tres banderas opcionales: i, m o x. Solo afecta la zona entre paréntesis.
(?-imx)La expresión regular desactiva las banderas opcionales i, m o x. Solo afecta la zona entre paréntesis.
(?: re)Similar a (...), pero no representa un grupo
(?imx: re)Usa las banderas opcionales i, m o x entre paréntesis
(?-imx: re)No usa las banderas opcionales i, m o x entre paréntesis
(?#...)Comentario.
(?= re)Delimitador de afirmación positiva hacia adelante. Si la expresión regular contenida, representada como ..., coincide con éxito 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; el resto del patrón aún debe intentar coincidir a la derecha del delimitador.
(?! re)Delimitador de negación hacia adelante. Lo opuesto al delimitador afirmativo; tiene éxito cuando la expresión contenida no puede coincidir en la posición actual de la cadena.
(?> re)Patrón independiente que coincide, evitando el retroceso.
\wCoincide con dígitos, letras y guiones bajos
\WCoincide con cualquier carácter que no sea dígito, letra 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 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.
\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 con 'er' en "verb".
\BCoincide con un no límite de palabra. 'er\B' puede coincidir con 'er' en "verb", pero no con 'er' en "never".
\n, \t, etc.Coincide con un carácter de nueva 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 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 sea dígito. Equivalente a [^0-9].
\sCoincide con cualquier carácter de espacio en blanco, incluidos espacio, tabulador, avance 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