Patrones de expresiones regulares complejas
Grupos de captura anidados
import re
def parse_complex_data(text):
pattern = r'((\w+)\s(\w+))\s\[(\d+)\]'
match = re.match(pattern, text)
if match:
full_name = match.group(1)
first_name = match.group(2)
last_name = match.group(3)
id_number = match.group(4)
return {
'full_name': full_name,
'first_name': first_name,
'last_name': last_name,
'id': id_number
}
text = 'John Doe [12345]'
result = parse_complex_data(text)
print(result)
Grupos no capturadores
import re
def extract_domain_info(url):
## (?:) crea un grupo no capturador
pattern = r'https?://(?:www\.)?([^/]+)'
match = re.match(pattern, url)
if match:
domain = match.group(1)
return domain
url = 'https://www.example.com/path'
domain = extract_domain_info(url)
print(domain)
Lookahead y Lookbehind
import re
def validate_password(password):
## Lookahead positivo para reglas de contraseña complejas
pattern = r'^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$'
return re.match(pattern, password) is not None
passwords = [
'Weak1',
'StrongPass123!',
'NoSpecialChar123'
]
for pwd in passwords:
print(f"{pwd}: {validate_password(pwd)}")
Flujo de complejidad de patrones de expresiones regulares
graph TD
A[Regex Pattern] --> B{Complexity Level}
B -->|Simple| C[Basic Matching]
B -->|Intermediate| D[Capture Groups]
B -->|Advanced| E[Lookaheads/Lookbehinds]
E --> F[Complex Validation]
Técnicas avanzadas de expresiones regulares
Técnica |
Símbolo |
Descripción |
Ejemplo |
Grupo no capturador |
(?:) |
Agrupa sin capturar |
(?:www\.)? |
Lookahead positivo |
(?=) |
Coincide si está seguido |
(?=.*\d) |
Lookahead negativo |
(?!) |
Coincide si no está seguido |
(?!.*secret) |
Lookbehind |
(?<=) |
Coincide si está precedido |
(?<=\$)\d+ |
Análisis recursivo
import re
def parse_nested_json(text):
pattern = r'\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}'
matches = re.findall(pattern, text)
return matches
json_like = '{key1: value1} {nested: {inner: value}}'
result = parse_nested_json(json_like)
print(result)
Consideraciones de rendimiento
import re
import timeit
def optimize_regex(pattern):
## Compila la expresión regular para un mejor rendimiento
compiled_pattern = re.compile(pattern)
return compiled_pattern
## Benchmark de la compilación de la expresión regular
pattern = r'(\w+)@(\w+)\.(\w+)'
compilation_time = timeit.timeit(
lambda: re.compile(pattern),
number=10000
)
print(f"Compilation Time: {compilation_time}")
Puntos clave
- Los patrones de expresiones regulares complejas requieren un diseño cuidadoso.
- Utilice estratégicamente los grupos no capturadores y de lookahead.
- Compile los patrones de expresiones regulares para mejorar el rendimiento.
- LabEx recomienda el aprendizaje incremental de técnicas avanzadas.