Python 3.15 deja obsoleto en suave re.match() por re.prefixmatch
Python 3.15 marca re.match() como obsoleto en suave a favor del nuevo re.prefixmatch(). Nada se rompe, nada avisa y no hay retirada prevista.
3 min de lectura

En cifras
- Python version adding re.prefixmatch()
- 3.15
- runtime warnings a soft deprecation emits
- 0
Python 3.15 añade una función llamada re.prefixmatch() y marca en su lugar el veterano re.match(), de 30 años, como obsoleto en suave. Las dos hacen exactamente lo mismo. El cambio va del nombre, porque match ha significado lo que no debía en Python desde que existe la función.
La documentación de Python 3.15 para el módulo re expone el motivo de forma directa. El nuevo nombre es «más explícitamente descriptivo», dice, y los desarrolladores deberían usarlo «para expresar mejor la intención». En la mayoría de los demás lenguajes, señala la documentación, match se refiere al comportamiento que Python siempre ha llamado search().
El problema del nombre
El re.match() de Python solo mira el principio de una cadena. Se ancla en la posición cero y ahí se detiene. re.search() recorre toda la cadena buscando el patrón en cualquier punto.
La mayoría de los demás lenguajes hacen lo contrario. Su «match» es el «search» de Python. Quien llega desde JavaScript, Ruby o Go lee re.match() y espera razonablemente que encuentre el patrón en cualquier parte. No lo hace, y el fallo que sigue es silencioso: el código simplemente devuelve None ante entradas que debería haber procesado.
re.match("world", "hello world") # None - anclado al principio
re.prefixmatch("world", "hello world") # None - misma función, nombre más claro
re.search("world", "hello world") # coincide
Hugo van Kemenade expuso el argumento en una entrada de blog publicada el 10 de septiembre de 2026, citando el Zen de Python: «Explícito es mejor que implícito. Quien lea el nombre prefixmatch() probablemente entenderá la semántica que se pretende.»
Tanto la función a nivel de módulo como el método de los patrones compilados reciben el nuevo nombre. re.Pattern.prefixmatch() acompaña a re.prefixmatch() en la 3.15.
Qué significa realmente «obsoleto en suave»
La obsolescencia suave es un proceso concreto definido en PEP 387, la política de compatibilidad hacia atrás de Python. Es mucho más débil que una obsolescencia normal, y la diferencia importa a quien mantiene código antiguo.
| Obsolescencia suave | Obsolescencia normal | |
|---|---|---|
| Aviso en tiempo de ejecución | Ninguno | DeprecationWarning |
| Retirada prevista | No | Sí, en una versión concreta |
| Sigue documentada y probada | Sí | Sí, hasta la retirada |
| Recibe nuevas funciones | No | No |
PEP 387 la define como «usar una API que ya no debería emplearse para escribir código nuevo, pero que sigue siendo seguro seguir usando en código existente». También dice con claridad que la obsolescencia suave «no emite ningún aviso: solo se menciona en la documentación».
Así que re.match() sigue funcionando. No está previsto retirarlo. Su conjunto de pruebas no empezará a imprimir avisos al pasar a la 3.15, y python -W error no fallará por ello.
Cuál de las cuatro usar
El módulo re ofrece ahora cuatro formas de aplicar un patrón a una cadena. Solo se diferencian en dónde se permite que esté el patrón.
| Función | Coincide | Añadida en |
|---|---|---|
re.prefixmatch() | Solo al principio | 3.15 |
re.match() | Solo al principio, obsoleta en suave | 1.5 |
re.search() | En cualquier parte de la cadena | 1.5 |
re.fullmatch() | La cadena entera, de principio a fin | 3.4 |
Qué significa esto para los desarrolladores
No hay nada urgente. Este es el raro cambio de API que no pide migración, no fija plazo y no rompe código.
En código nuevo sobre 3.15 o posterior, escriba re.prefixmatch(). El nombre le dice al siguiente lector qué hace realmente la llamada, que es justo el objetivo del cambio.
Para el código existente, el ejercicio útil no es un buscar y reemplazar. Es una revisión. Cada llamada a re.match() en su base de código es un punto donde alguien pudo querer decir re.search(). Las pruebas no lo detectarían si solo pasaron entradas donde el patrón estaba al principio. Esos son fallos reales anteriores a la 3.15, y un grep rápido encontrará los candidatos antes que cualquier herramienta.
Eso sí, tenga cuidado al saltar directamente a re.prefixmatch() en una biblioteca. Llamarla obliga a su paquete a exigir Python 3.15 o posterior, y re.match() es la forma portable entre versiones hasta que su versión mínima admitida se ponga al día. Las bases de código grandes conviven años con esa distancia; los desarrolladores de EVE Online empezaron su migración a Python 3 mucho después de la separación de versiones.
Conviene fijarse en la señal más amplia. El equipo central de Python está dispuesto a gastar un nombre nuevo y una nota en la documentación solo para que una API antigua se lea bien, sin obligar a nadie a cambiar una línea. Es una limpieza barata, y cuanta más haga Python, menos retornos None silenciosos tendrá que depurar la próxima generación de desarrolladores de Python.
Fuentes
- 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
Artículos relacionados

HTTP QUERY ya tiene RFC, pero casi ninguna implementación
La RFC 10008 dio a HTTP un método QUERY en junio de 2026: seguro e idempotente como GET, con cuerpo de petición como POST. Casi nada lo implementa todavía.

EVE Online empieza a mover 2,4 millones de líneas de Python 2 a Python 3
CCP Games dice que el 95,9 % de los 2,4 millones de líneas de EVE ya se analiza bajo las dos versiones de Python. Las 3.300 líneas restantes son las que bloquean el paso.

Mojo pasa a ser de código abierto bajo Apache 2.0, las contribuciones siguen cerradas
Modular liberó como código abierto el compilador y las herramientas de Mojo bajo Apache 2.0, una semana después de Mojo 1.0, pero no aceptará contribuciones externas al compilador hasta finales de 2026.