Motifs d'expressions régulières complexes
Groupes de capture imbriqués
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)
Groupes non capturants
import re
def extract_domain_info(url):
## (?:) crée un groupe non capturant
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 et Lookbehind
import re
def validate_password(password):
## Lookahead positif pour les règles de mot de passe complexes
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)}")
Flux de complexité des motifs d'expressions régulières
graph TD
A[Motif d'expression régulière] --> B{Niveau de complexité}
B -->|Simple| C[Correspondance de base]
B -->|Intermédiaire| D[Groupes de capture]
B -->|Avancé| E[Lookaheads/Lookbehinds]
E --> F[Validation complexe]
Techniques avancées d'expressions régulières
Technique |
Symbole |
Description |
Exemple |
Groupe non capturant |
(?:) |
Groupes sans capture |
(?:www\.)? |
Lookahead positif |
(?=) |
Correspond si suivi de |
(?=.*\d) |
Lookahead négatif |
(?!) |
Correspond si non suivi |
(?!.*secret) |
Lookbehind |
(?<=) |
Correspond si précédé de |
(?<=\$)\d+ |
Analyse récursive
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)
import re
import timeit
def optimize_regex(pattern):
## Compiler l'expression régulière pour de meilleures performances
compiled_pattern = re.compile(pattern)
return compiled_pattern
## Benchmark de la compilation de l'expression régulière
pattern = r'(\w+)@(\w+)\.(\w+)'
compilation_time = timeit.timeit(
lambda: re.compile(pattern),
number=10000
)
print(f"Compilation Time: {compilation_time}")
Points clés
- Les motifs d'expressions régulières complexes nécessitent une conception minutieuse
- Utilisez stratégiquement les groupes non capturants et les lookahead
- Compilez les motifs d'expressions régulières pour améliorer les performances
- LabEx recommande d'apprendre progressivement les techniques avancées