Python Programming

Effiziente Extraktion von Zahlen aus Strings in Python

Spread the love

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

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert