Fortgeschrittene Techniken für Erfassungsgruppen (Advanced Capture Group Techniques)
Über die grundlegenden Erfassungsgruppen hinaus bietet Python Regex (reguläre Ausdrücke) erweiterte Funktionen wie verschachtelte Erfassungsgruppen, nicht-erfassende Gruppen und Lookarounds.
Verschachtelte Erfassungsgruppen (Nested Capture Groups)
Erfassungsgruppen können innerhalb anderer Erfassungsgruppen verschachtelt werden, um detailliertere Informationen zu extrahieren.
Erstellen Sie eine neue Datei namens nested_capture.py im Verzeichnis ~/project.
touch ~/project/nested_capture.py
Öffnen Sie nested_capture.py und fügen Sie den folgenden Code hinzu:
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.")
Speichern Sie die Datei.
Führen Sie das Skript aus.
python ~/project/nested_capture.py
Die Ausgabe zeigt die extrahierten Daten, einschließlich des vollständigen Namens und seiner Komponenten:
Full Name: John Doe
First Name: John
Last Name: Doe
ID: 12345
Hier ist ((\w+)\s(\w+)) eine verschachtelte Erfassungsgruppe. group(1) erfasst den gesamten Namen "John Doe", group(2) erfasst "John" und group(3) erfasst "Doe". group(4) erfasst die ID.
Nicht-erfassende Gruppen (Non-Capturing Groups)
Manchmal müssen Sie Teile eines Musters gruppieren, um Quantifizierer oder Alternativen anzuwenden, aber Sie müssen den Inhalt nicht erfassen. Nicht-erfassende Gruppen (?:...) werden für diesen Zweck verwendet.
Erstellen Sie eine neue Datei namens non_capturing.py im Verzeichnis ~/project.
touch ~/project/non_capturing.py
Öffnen Sie non_capturing.py und fügen Sie den folgenden Code hinzu:
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}")
Speichern Sie die Datei.
Führen Sie das Skript aus.
python ~/project/non_capturing.py
Die Ausgabe zeigt die extrahierten Domainnamen:
Domain from 'https://www.example.com/path': example.com
Domain from 'http://example.org/another/path': example.org
In diesem Beispiel gleicht (?:www\.)? "www." ab, falls es existiert, erfasst es aber nicht, sodass group(1) direkt den Domainnamen erfasst.
Die Verwendung von nicht-erfassenden Gruppen kann die Leistung geringfügig verbessern und die Indizes der erfassten Gruppen sauberer halten, wenn Sie nur bestimmte Teile eines größeren Musters erfassen müssen.