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.
3 Min. Lesezeit

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ündigung | Normale Abkündigung | |
|---|---|---|
| Warnung zur Laufzeit | Keine | DeprecationWarning |
| Entfernung geplant | Nein | Ja, in einer benannten Version |
| Bleibt dokumentiert und getestet | Ja | Ja, bis zur Entfernung |
| Erhält neue Funktionen | Nein | Nein |
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.
| Funktion | Trifft | Hinzugefügt in |
|---|---|---|
re.prefixmatch() | Nur am Anfang | 3.15 |
re.match() | Nur am Anfang, sanft abgekündigt | 1.5 |
re.search() | Überall in der Zeichenkette | 1.5 |
re.fullmatch() | Die ganze Zeichenkette, von Anfang bis Ende | 3.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
- Soft-deprecating re.match() - hugovk.dev
- re - Regular expression operations (Python 3.15) - Python documentation
- What's New In Python 3.15 - Python documentation
- PEP 387 - Backwards Compatibility Policy - Python Enhancement Proposals
Ähnliche Artikel

HTTP QUERY hat einen RFC, aber kaum Implementierungen
RFC 10008 gab HTTP im Juni 2026 eine QUERY-Methode: sicher und idempotent wie GET, mit einem Request-Body wie POST. Fast nichts implementiert sie bisher.

EVE Online beginnt Umzug von 2,4 Millionen Zeilen Python 2 auf Python 3
CCP Games sagt, 95,9 % der 2,4 Millionen Zeilen von EVE ließen sich schon unter beiden Python-Versionen parsen. Die restlichen 3.300 Zeilen blockieren den Umzug.

Mojo wird Open Source unter Apache 2.0, Beiträge bleiben geschlossen
Modular hat Compiler und Tooling von Mojo unter Apache 2.0 offengelegt - eine Woche nach Mojo 1.0. Beiträge zum Compiler nimmt das Unternehmen aber erst Ende 2026 an.