Skip to content
Tech AI Wire

Python 3.15 stuft re.match() zugunsten von re.prefixmatch zurück

Python 3.15 stuft re.match() zugunsten des neuen re.prefixmatch() sanft ab. Nichts bricht, nichts warnt, und eine Entfernung ist nicht geplant.

Von Tech AI Wire Team

3 Min. Lesezeit

XLinkedIn
The Python 3.15 documentation page for the re module, showing the soft-deprecation note attached to re.match().

Die Zahlen

Python version adding re.prefixmatch()
3.15
runtime warnings a soft deprecation emits
0

Python 3.15 fügt eine Funktion namens re.prefixmatch() hinzu und markiert das 30 Jahre alte re.match() an ihrer Stelle als „soft deprecated“, also sanft abgekündigt. Beide tun genau dasselbe. Bei der Änderung geht es um den Namen, denn match bedeutet in Python schon so lange das Falsche, wie es die Funktion gibt.

Die Python-3.15-Dokumentation zum Modul re nennt die Begründung direkt. Der neue Name sei „ausdrücklich beschreibender“, heißt es dort, und Entwickler sollten ihn nutzen, „um die Absicht besser auszudrücken“. In den meisten anderen Sprachen, merkt die Dokumentation an, bezeichnet match das Verhalten, das Python seit jeher search() nennt.

Das Namensproblem

Pythons re.match() schaut nur an den Anfang einer Zeichenkette. Es verankert sich an Position null und hört dort auf. re.search() durchsucht die gesamte Zeichenkette nach dem Muster an beliebiger Stelle.

Die meisten anderen Sprachen machen es umgekehrt. Ihr „match“ ist Pythons „search“. Wer von JavaScript, Ruby oder Go kommt, liest re.match() und erwartet berechtigterweise, dass es das Muster überall findet. Das tut es nicht, und der folgende Fehler bleibt stumm: Der Code liefert einfach None bei Eingaben, die er hätte verarbeiten sollen.

re.match("world", "hello world")       # None - am Anfang verankert
re.prefixmatch("world", "hello world") # None - dieselbe Funktion, klarerer Name
re.search("world", "hello world")      # trifft zu

Hugo van Kemenade legte den Fall in einem Blogbeitrag vom 10. September 2026 dar und zitierte das Zen of Python: „Explizit ist besser als implizit. Wer den Namen prefixmatch() liest, versteht die beabsichtigte Bedeutung wahrscheinlich.“

Sowohl die Funktion auf Modulebene als auch die Methode kompilierter Muster bekommen den neuen Namen. re.Pattern.prefixmatch() kommt in 3.15 zu re.prefixmatch() hinzu.

Was „soft deprecated“ tatsächlich bedeutet

Die sanfte Abkündigung ist ein festgelegtes Verfahren aus PEP 387, Pythons Richtlinie zur Abwärtskompatibilität. Sie ist viel schwächer als eine normale Abkündigung, und der Unterschied zählt für alle, die älteren Code pflegen.

Sanfte AbkündigungNormale Abkündigung
Warnung zur LaufzeitKeineDeprecationWarning
Entfernung geplantNeinJa, in einer benannten Version
Bleibt dokumentiert und getestetJaJa, bis zur Entfernung
Erhält neue FunktionenNeinNein

PEP 387 definiert sie als „die Nutzung einer API, die für neuen Code nicht mehr verwendet werden sollte, deren weitere Nutzung in bestehendem Code aber sicher bleibt“. Es sagt außerdem klar, dass eine sanfte Abkündigung „keine Warnung ausgibt: Sie wird nur in der Dokumentation erwähnt“.

re.match() funktioniert also weiter. Eine Entfernung ist nicht geplant. Ihre Testsuite fängt beim Wechsel auf 3.15 nicht an, Warnungen auszugeben, und python -W error scheitert daran nicht.

Zu welcher der vier man greifen sollte

Das Modul re bietet jetzt vier Wege, ein Muster auf eine Zeichenkette anzuwenden. Sie unterscheiden sich nur darin, wo das Muster stehen darf.

FunktionTrifftHinzugefügt in
re.prefixmatch()Nur am Anfang3.15
re.match()Nur am Anfang, sanft abgekündigt1.5
re.search()Überall in der Zeichenkette1.5
re.fullmatch()Die ganze Zeichenkette, von Anfang bis Ende3.4

Was das für Entwickler bedeutet

Es eilt nichts. Dies ist die seltene API-Änderung, die keine Migration verlangt, keine Frist setzt und keinen Code bricht.

Schreiben Sie in neuem Code ab 3.15 re.prefixmatch(). Der Name sagt der nächsten Leserin, was der Aufruf wirklich tut, und genau darum geht es bei der Änderung.

Für bestehenden Code ist die nützliche Übung kein Suchen und Ersetzen. Es ist eine Prüfung. Jeder re.match()-Aufruf in Ihrer Codebasis ist eine Stelle, an der jemand vielleicht re.search() gemeint hat. Die Tests würden es nicht bemerken, wenn sie nur Eingaben übergeben haben, bei denen das Muster vorn stand. Das sind echte Fehler, die älter sind als 3.15, und ein schnelles grep findet die Kandidaten schneller als jedes Werkzeug.

Seien Sie aber vorsichtig damit, in einer Bibliothek sofort auf re.prefixmatch() zu wechseln. Der Aufruf verlangt von Ihrem Paket Python 3.15 oder neuer, und re.match() ist die versionsübergreifend portable Schreibweise, bis Ihre kleinste unterstützte Version nachzieht. Große Codebasen leben jahrelang mit dieser Lücke; die Entwickler von EVE Online begannen ihre Migration auf Python 3 lange nach der Versionstrennung.

Das größere Signal ist bemerkenswert. Das Python-Kernteam ist bereit, einen neuen Namen und eine Anmerkung in der Dokumentation aufzuwenden, nur damit sich eine alte API richtig liest, ohne jemanden zu zwingen, eine Zeile zu ändern. Das ist eine günstige Art von Aufräumen, und je mehr Python davon tut, desto weniger stumme None-Rückgaben muss die nächste Generation von Python-Entwicklern debuggen.

Quellen

  1. Soft-deprecating re.match() - hugovk.dev
  2. re - Regular expression operations (Python 3.15) - Python documentation
  3. What's New In Python 3.15 - Python documentation
  4. PEP 387 - Backwards Compatibility Policy - Python Enhancement Proposals

Ähnliche Artikel