Python 3.15 estrena re.prefixmatch() y deja re.match() como obsoleto blando
El nuevo alias aclara que la función solo ancla al principio de la cadena. El nombre antiguo se queda: no hay avisos ni plan de eliminación.

La librería estándar de Python arrastra desde hace décadas una trampa conocida: re.match() no busca en cualquier parte de la cadena, solo al principio. Python 3.15 añade re.prefixmatch() como alias con nombre explícito de esa misma operación y marca re.match() como obsoleto blando. Nadie piensa borrarlo.
Qué significa obsoleto blando
El término viene de la política de compatibilidad hacia atrás del lenguaje, PEP 387, que definió la deprecación blanda en 2023. Una API así deja de recomendarse para código nuevo, pero se mantiene documentada y cubierta por tests, no emite avisos y no implica una eliminación futura. Es solo una nota en la documentación. La decisión de convertirla en una deprecación dura, con retirada posterior, es independiente y no está sobre la mesa: re.match() lleva más de 30 años en uso.
El cambio es semántico. re.prefixmatch() describe sin ambigüedad que solo se ancla el inicio:
re.match("pi", "api") # no hay coincidencia
re.search("pi", "api") # coincide, span (1, 3)
re.fullmatch("pi", "api") # no hay coincidencia
re.match() equivale a re.search con el patrón anclado al principio, ya sea con ^ o con \A. Quien lee prefixmatch() entiende la intención de un vistazo; quien lee match() todavía puede dudar. Ese es todo el argumento.
Adoptarlo o no
El consejo de los mantenedores es directo: el código que tiene que correr en versiones antiguas de Python sigue usando match() sin problema, y el código nuevo debería preferir prefixmatch(). Si lo que se quería era buscar en cualquier posición, la función correcta era search() desde el principio; si se buscaba la cadena completa, fullmatch().
Para forzar la sustitución en un proyecto, la regla TID251 de Ruff, heredera de flake8-tidy-imports, permite declarar re.match como API prohibida en pyproject.toml con un mensaje que apunte a la alternativa. Avisa, no rompe.
El interés real está en el patrón: durante años, media comunidad ha escrito re.match() creyendo que buscaba en cualquier parte. El nombre nuevo no arregla el código existente, pero sí evita que siga creciendo. Que se quede ahí y no salte a otras funciones con nombres heredados de los noventa es lo único que falta por confirmar.


