Patrones de búsqueda con regex y el módulo re: clases, cuantificadores, grupos, matching, búsqueda, sustitución y split.
# ab+c (b una o mas): 'abc', 'abbc', 'abbbc' | 'ac' no# ab*c (b cero o mas): 'ac', 'abc', 'abbc'# ab?c (b cero o una): 'ac', 'abc' | 'abbc' no# a\d{2} (exacto 2 dig): 'a42', 'a07' | 'a4' no^: inicio del string.$: fin del string.# ^Hola -> el string EMPIEZA con 'Hola'# mundo$ -> el string TERMINA con 'mundo'# ^\d+$ -> el string COMPLETO son solo digitos: '123' si | '12a' no# 'a', luego 'b' entre 3 y 5 veces, luego 'c'# ab{3,5}c -> abbbc, abbbbc, abbbbbcLos grupos se numeran de izquierda a derecha según su paréntesis de apertura, empezando en 1; group(0) (o group()) devuelve toda la coincidencia.
Los paréntesis también sirven para aplicar un cuantificador a un grupo completo: a(bc)*d coincide con ad, abcd, abcbcd, ...
(?P<nombre>...) es un grupo de captura con nombre, accesible por su etiqueta. Por ejemplo, para extraer el código de área: \+(?P<area>\d{2})\d{9}.import re patron = '(?P<usuario>[\w.]+)@(?P<dominio>mail|mimail)\.cl'm = re.fullmatch(patron, '[email protected]') print(m.group('usuario')) # 'ana.perez'print(m.group('dominio')) # 'mail'print(m.groupdict()) # {'usuario': 'ana.perez', 'dominio': 'mail'}import re def es_mail_valido(email): patron = '[\w.]+@((seccion1|seccion2)\.)?(mimail|mail)\.cl' return bool(re.fullmatch(patron, email)) print(es_mail_valido('[email protected]')) # Trueprint(es_mail_valido('[email protected]')) # Falsere.split(patron, s) separa el string según el patrón (más potente que str.split). Con (?:...) se hace un grupo sin captura, para que split solo devuelva las partes.import reprint(re.split('[aeiou]', 'hola mundo')) # h - l - m - nd -Para probar y depurar tus patrones rápidamente, usa regex101.com o pythex.org: muestran qué partes del texto hacen match y explican cada token.