Techniques Avancées des Groupes de Capture (Advanced Capture Group Techniques)
Au-delà des groupes de capture de base, les expressions régulières (regex) Python offrent des fonctionnalités plus avancées telles que les groupes de capture imbriqués, les groupes non-capturants et les assertions (lookarounds).
Groupes de Capture Imbriqués (Nested Capture Groups)
Les groupes de capture peuvent être imbriqués dans d'autres groupes de capture pour extraire des informations plus granulaires.
Créez un nouveau fichier nommé nested_capture.py dans le répertoire ~/project.
touch ~/project/nested_capture.py
Ouvrez nested_capture.py et ajoutez le code suivant :
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
}
return None
text = 'John Doe [12345]'
result = parse_complex_data(text)
if result:
print(f"Full Name: {result['full_name']}")
print(f"First Name: {result['first_name']}")
print(f"Last Name: {result['last_name']}")
print(f"ID: {result['id']}")
else:
print("No match found.")
Enregistrez le fichier.
Exécutez le script.
python ~/project/nested_capture.py
La sortie affichera les données extraites, y compris le nom complet et ses composantes :
Full Name: John Doe
First Name: John
Last Name: Doe
ID: 12345
Ici, ((\w+)\s(\w+)) est un groupe de capture imbriqué. group(1) capture l'ensemble de "John Doe", group(2) capture "John" et group(3) capture "Doe". group(4) capture l'ID.
Groupes Non-Capturants (Non-Capturing Groups)
Parfois, vous devez regrouper des parties d'un motif pour appliquer des quantificateurs ou des alternatives, mais vous n'avez pas besoin de capturer le contenu. Les groupes non-capturants (?:...) sont utilisés à cette fin.
Créez un nouveau fichier nommé non_capturing.py dans le répertoire ~/project.
touch ~/project/non_capturing.py
Ouvrez non_capturing.py et ajoutez le code suivant :
import re
def extract_domain_info(url):
## (?:) creates a non-capturing group
pattern = r'https?://(?:www\.)?([^/]+)'
match = re.match(pattern, url)
if match:
domain = match.group(1) ## Only the domain is captured
return domain
return None
url1 = 'https://www.example.com/path'
domain1 = extract_domain_info(url1)
print(f"Domain from '{url1}': {domain1}")
url2 = 'http://example.org/another/path'
domain2 = extract_domain_info(url2)
print(f"Domain from '{url2}': {domain2}")
Enregistrez le fichier.
Exécutez le script.
python ~/project/non_capturing.py
La sortie affichera les noms de domaine extraits :
Domain from 'https://www.example.com/path': example.com
Domain from 'http://example.org/another/path': example.org
Dans cet exemple, (?:www\.)? correspond à "www." s'il existe, mais ne le capture pas, de sorte que group(1) capture directement le nom de domaine.
L'utilisation de groupes non-capturants peut légèrement améliorer les performances et maintient les indices des groupes capturés plus propres lorsque vous n'avez besoin de capturer que des parties spécifiques d'un motif plus large.