El módulo re cuenta con funciones para trabajar con expresiones regulares y cadenas.
La función match()
La función match comprueba si una expresión regular tiene coincidencias con el comienzo de una cadena de texto. Se basa en el siguiente formato:
match(expresiónregular, cadena, [flag])
Valores de flag:
flag re.IGNORECASE: No se hará diferencia entre mayúsculas y minúsculas
flag re.VERBOSE: Los comentarios y espacios son ignorados (en la expresión).
import re cadena1 = 'casa' cadena2 = 'casas' cadena3 = 'pasa' if re.match(cadena1, cadena2): print('cadena1 y cadena2 son coincidentes') else: print('cadena1 y cadena2 no son coincidentes') if re.match(cadena1, cadena3): print('cadena1 y cadena3 son coincidentes') else: print('cadena1 y cadena3 no son coincidentes')
Comodines
Con match el punto “.” actúa como un comodín para un solo carácter y representa a cualquier carácter, excepto \n
import re if re.match('.asa', cadena1) and re.match('.asa', cadena3): print('cadena1 y cadena3 terminan en .asa') else: print('cadena1 y cadena3 no terminan en .asa')
Carácter especial
Cualquier carácter especial se escribirá detrás de una barra invertida “\”. Por ejemplo, para expresar el carácter punto y no el comodín lo indicaremos escribiendo \.
import re extension = '\.jpg' if re.match(extension, '.jpg') != None: print('El archivo es una imagen jpg')
Alternativas
La barra vertical “|” expresa distintas alternativas que podrán darse para que se cumpla la expresión.
import re extensiones = ['jpg', 'png', 'gif', 'mp3', 'doc'] for tipoarchivo in extensiones: if re.match('jpg|png|gif|bmp', tipoarchivo): print('La extensión ', tipoarchivo, 'se corresponde con una imagen') else: print('La extensión ', tipoarchivo, 'no se corresponde con una imagen')
Grupos aislados
Los paréntesis “()” permiten aislar un grupo de caracteres que pueden ser distintos.
import re palabras = ['careta', 'carpeta', 'colita', 'cateta', 'cocreta', 'caleta', 'caseta'] for termino in palabras: if re.match('ca(..|...)ta', termino): print(termino) # careta , carpeta, cateta, caleta, caseta maspalabras = ['masa', 'mata', 'mar', 'mana','cama', 'marea'] for termino in maspalabras: if re.match('ma(s|m|n)a', termino): print(termino) # masa, mana
Rangos
Los corchetes “[]” se emplean para expresar rangos de numeros, alfabéticos y de otros caracteres especiales.
import re codigos = ['se1', 'se9', 'ma2', 'se:','se.', 'se2', 'hu2', 'se3', 'sea', 'sec'] for elemento in codigos: if re.match('se[0-5]', elemento): # el 3er carácter puede ser nº de 0-5 print(elemento) for elemento in codigos: if re.match('se[0-5a-z]', elemento): # nº de 0 a 5 y letra de a a z print(elemento) for elemento in codigos: if re.match('se[.:]', elemento): # el tercer carácter puede ser . ó : print( elemento) for elemento in codigos: if re.match('se[^0-2]', elemento): # debe comenzar por nº de 0 a 2 print(elemento)
Caracteres predefinidos
\d Cualquier carácter que sea dígito
\D Cualquier carácter que no sea dígito
\w Cualquier carácter alfanumérico
\W Cualquier carácter no alfanumérico
\s Espacio en blanco
\S Cualquier carácter que no sea espacio
import re for elemento in codigos: if re.match('se\d', elemento): # el 3er carácter debe ser número print( elemento)
Caracteres que permiten repeticiones
+ El carácter de la izquierda aparecerá una o varias veces
* El carácter de la izquierda aparecerá cero o más veces
? El carácter de la izquierda aparecerá cero o una vez
{} Indica el número de veces que debe aparecer el carácter de la izquierda:
{3} 3 veces; {1,4} de 1 a 4; {,3} de 0 a 3; {2,} dos o más veces
import re codigos = ['aaa111', 'aab11', 'aaa1111', 'aaz1', 'aaa'] for elemento in codigos: if re.match('aa[a-z]1{2,}', elemento): print(elemento) # aaa111 , aab11, aaa1111 for elemento in codigos: if re.match('a+1+', elemento): print(elemento) # aaa111 , aaa1111
El objeto mo y el método group()
El método group del objeto mo devuelve la cadena encontrada o produce excepción
import re mo = re.match('ftp://.+\com', 'ftp://ovh.com') print(mo.group()) # ftp://ovh.com Con los paréntesis acotamos los grupos: import re mo = re.match('ftp://(.+)\com', 'ftp://ovh.com') print(mo.group(0)) # ftp://ovh.com print(mo.group(1)) # ovh. print(mo.groups()) # ('ovh.',).
La función search()
La función search es como match pero busca coincidencias de un patrón en una cadena de texto y dichas coincidencias pueden aparecer en cualquier lugar. Su formato es: search(patrón, cadena, [flag])
import re palabras = ['paniaguado', 'agüita', 'aguador', 'paraguas', 'agua'] for elemento in palabras: if re.search('agua', elemento): print( elemento) # paniaguado, aguador, paraguas, agua
Coincidencias al comienzo y al final
Busca una subcadena al ^ COMIENZO o al $ FINAL de una cadena:
import re lista_url = ['http://www.aaa.es', 'ftp://www.aaa.es', 'http://www.bbb.es'] for elemento in lista_url: if re.search('^ftp://', elemento): print(elemento) # ftp://www.aaa.es lista_dom = ['.com', '.es'] for elemento in lista_dom: if re.search('es$', elemento): print(elemento) # .es
Métodos start() y end()
El método start() devuelve la posición inicial y el método end() la final, si la subcadena está en la cadena.
import re mo1 = re.search('agua', 'paraguas') print(mo1.start()) # devuelve 3 print(mo1.end()) # devuelve 7
La función findall()
La función findall() devuelve una lista con las subcadenas que cumplen el patrón en una cadena. El formato que utiliza es: findall(patrón, cadena, [flag])
cadena = 'tengo una yama que yama se llama' lista = re.findall('..ama', cadena) print(lista) # muestra: [' yama', ' yama', 'llama']
La función finditer()
La función finditer() permite usar un iterador para recorrer las subcadenas que cumplen el patrón. El resultado son tuplas con las posiciones de las subcadenas.
cadena = 'tengo una yama que yama se llama' iterador = re.finditer('ama', cadena) for encontrado in iterador: print(encontrado.span()) # (11, 14) , (20, 23) , (29, 32)
La función compile()
La función compile() se utiliza para compilar una expresión regular, devolviendo un objeto especial llamado RegexObject. La compilación es un paso previo que conlleva la evaluación del patrón que indiquemos en la función; que después utilizaremos con las funciones split(), sub(), subn() y otras.
Es importante señalar que la mayoría de las operaciones con expresiones regulares que están disponibles como métodos compilados a nivel de módulo, están también como funciones, con algunas diferencias en sus parámetros. Las funciones son atajos que no requieren el paso de la compilación.
La función sub() con compilación
La función sub() busca y sustituye cadenas usando el siguiente formato:
sub(cadenaparasustituir, cadenadondesebusca, [count=número])
En el ejemplo siguiente se declara una clave y todos sus caracteres no numéricos se sustituyen por "0":
import re clave = "asdb92z$" # \D se refiere a cualquier carácter que no es número patron = re.compile("\D") # Se sustituyen los caracteres encontrados por "0" nueva_clave = patron.sub("0", clave) print(nueva_clave) # 00009200 # Para motrar el tipo de objeto de "patron": orint(type(patron)) # Otra forma de expresarlo: nueva_clave = re.compile("\D").sub("0", clave)
Otros ejemplos
import re oracion = 'la norma es la norma' patron = re.compile('norma') print(patron.sub('ley', oracion)) # la ley es la ley patron = re.compile('la') print(patron.sub('LA', oracion, count=1)) # LA norma es la norma
La función subn() con compilación
La función subn() es como sub() pero devuelve una tupla con dos valores: el primero contiene la cadena resultado después de aplicar las sustituciones y en el segundo el número de sustituciones realizadas.
En el siguiente ejemplo en vez de utilizar el patrón "\D" se emplea "\d" que se refiere a todos los caracteres numéricos. Dicho patrón se utilizará para sustituir todos los caracteres numéricos por el caracter "x":
clave = "asdb92z$" patron = re.compile("\d") tupla_resultado = patron.subn("x", clave) print(tupla_resultado[0]) # asdbxxz$ print(tupla_resultado[1]) # 2
La función split() con compilación
La función split() divide una cadena en subcadenas: split(cadena, [maxsplit=0])
import re meses = 'ene+feb+mar+abr+may+jun' patron = re.compile('\+') print(patron.split(meses)) # ['ene', 'feb', 'mar', 'abr', 'may', 'jun'] patron = re.compile('\+') print(patron.split(meses, maxsplit=1)) # ['ene', 'feb+mar+abr+may+jun']
Ir al índice del tutorial de Python