Das Extrahieren numerischer Daten aus Strings ist eine häufige Aufgabe in der Python-Programmierung, insbesondere bei der Datenbereinigung und dem Web Scraping. Dieser Artikel untersucht mehrere effiziente und vielseitige Methoden, um dies zu erreichen, und berücksichtigt verschiedene Szenarien und Komplexitätsstufen.
Inhaltsverzeichnis
- Methode 1: Verwendung regulärer Ausdrücke
- Methode 2: Verwendung von List Comprehension
- Methode 3: Kombination von
filter
undisdigit()
- Methode 4: Erweiterte reguläre Ausdrücke für komplexe Muster
- Umgang mit Variationen in Zahlenformaten
- Fazit
Methode 1: Verwendung regulärer Ausdrücke
Reguläre Ausdrücke (Regex) bieten einen leistungsstarken und flexiblen Ansatz, insbesondere für komplexe Stringstrukturen. Pythons re
-Modul erleichtert diesen Prozess.
import re
def extract_numbers_regex(text):
"""Extrahiert Zahlen aus einem String mit regulären Ausdrücken."""
numbers = re.findall(r'-?d+(.d+)?', text) # Findet ganze Zahlen und Dezimalzahlen, einschließlich negativer Zahlen
return [float(num) for num in numbers]
text = "Es gibt -12 Äpfel und 3.14 Orangen, und auch 12345."
numbers = extract_numbers_regex(text)
print(numbers) # Ausgabe: [-12.0, 3.14, 12345.0]
Dieser verbesserte Regex r'-?d+(.d+)?'
verarbeitet negative Zahlen und Dezimalzahlen effektiv.
Methode 2: Verwendung von List Comprehension
List Comprehension bietet eine prägnante und Pythonische Lösung, ideal für einfachere Szenarien, in denen Zahlen klar abgegrenzt sind.
def extract_numbers_list_comprehension(text):
"""Extrahiert ganze Zahlen aus einem String mit List Comprehension."""
return [int(c) for c in text if c.isdigit()]
text = "123abc456"
numbers = extract_numbers_list_comprehension(text)
print(numbers) # Ausgabe: [1, 2, 3, 4, 5, 6]
Diese Methode ist effizient zum Extrahieren einzelner Ziffern, ist aber möglicherweise nicht für mehrstellige Zahlen oder Zahlen mit Dezimalpunkten geeignet.
Methode 3: Kombination von filter
und isdigit()
Dieser funktionale Ansatz verwendet filter()
und isdigit()
für eine klare und lesbare Lösung, die für einfachere Fälle geeignet ist.
def extract_numbers_filter(text):
"""Extrahiert ganze Zahlen aus einem String mit filter und isdigit()."""
numbers = list(filter(str.isdigit, text))
return [int(num) for num in numbers]
text = "1a2b3c4d5"
numbers = extract_numbers_filter(text)
print(numbers) #Ausgabe: [1, 2, 3, 4, 5]
Ähnlich wie List Comprehension extrahiert diese Methode einzelne Ziffern und verarbeitet keine komplexeren Zahlenformate.
Methode 4: Erweiterte reguläre Ausdrücke für komplexe Muster
Reguläre Ausdrücke glänzen wirklich, wenn es um komplizierte Muster geht, wie z. B. Zahlen in wissenschaftlicher Notation oder mit Tausendertrennzeichen.
import re
def extract_numbers_complex(text):
"""Extrahiert Zahlen (einschließlich wissenschaftlicher Notation) aus einem String mit Regex."""
numbers = re.findall(r'-?d+(?:,d{3})*(?:.d+)?(?:[eE][+-]?d+)?', text)
return [float(num.replace(',', '')) for num in numbers]
text = "Der Preis ist $1.234,56 und die Menge ist 1.23e-5. Ein weiterer Preis ist 100.000"
numbers = extract_numbers_complex(text)
print(numbers) # Ausgabe: [1234.56, 1.23e-05, 100000.0]
Dieser Regex verarbeitet Kommas als Tausendertrennzeichen und wissenschaftliche Notation. Das replace(',', '')
entfernt Kommas vor der Konvertierung in Float.
Umgang mit Variationen in Zahlenformaten
Um verschiedene Formate anzupassen, beachten Sie diese Punkte:
- Negative Zahlen: Fügen Sie
-?
am Anfang Ihres Regex-Musters hinzu (z. B.r'-?d+'
). - Wissenschaftliche Notation: Fügen Sie
(?:[eE][+-]?d+)?
hinzu, um Exponenten zu verarbeiten (wie in Methode 4 gezeigt). - Tausendertrennzeichen: Verwenden Sie
(?:,d{3})*
, um optionale Tausendertrennzeichen zu finden (wie in Methode 4 gezeigt). - Währungssymbole: Bearbeiten Sie Ihren String vor der Extraktion vor, um Währungssymbole zu entfernen, oder verwenden Sie einen komplexeren Regex.
Fazit
Die optimale Methode hängt von der Komplexität Ihrer Eingabe-Strings und der gewünschten Genauigkeit ab. Für einfache Fälle könnte List Comprehension oder filter
ausreichen. Für Robustheit und die Verarbeitung verschiedener Zahlenformate sind reguläre Ausdrücke jedoch unschätzbar wertvoll.