Python 3.15 torna re.match() obsoleto em favor de re.prefixmatch
O Python 3.15 marca re.match() como obsoleto de forma branda em favor do novo re.prefixmatch(). Nada quebra, nada avisa e não há remoção prevista.
3 min de leitura

Em números
- Python version adding re.prefixmatch()
- 3.15
- runtime warnings a soft deprecation emits
- 0
O Python 3.15 acrescenta uma função chamada re.prefixmatch() e, em seu lugar, marca o re.match(), com 30 anos de idade, como obsoleto de forma branda. As duas fazem exatamente a mesma coisa. A mudança é sobre o nome, porque match significa a coisa errada em Python desde que a função existe.
A documentação do Python 3.15 para o módulo re expõe o motivo de forma direta. O novo nome é "mais explicitamente descritivo", diz ela, e os desenvolvedores devem usá-lo "para expressar melhor a intenção". Na maioria das outras linguagens, observa a documentação, match se refere ao comportamento que o Python sempre chamou de search().
O problema do nome
O re.match() do Python olha apenas o início de uma string. Ele se ancora na posição zero e para por ali. O re.search() percorre a string inteira procurando o padrão em qualquer posição.
A maioria das outras linguagens faz o contrário. O "match" delas é o "search" do Python. Quem chega do JavaScript, do Ruby ou do Go lê re.match() e espera, com razão, que ele encontre o padrão em qualquer lugar. Não encontra, e o erro que se segue é silencioso: o código simplesmente devolve None para uma entrada que deveria ter tratado.
re.match("world", "hello world") # None - ancorado no início
re.prefixmatch("world", "hello world") # None - mesma função, nome mais claro
re.search("world", "hello world") # corresponde
Hugo van Kemenade apresentou o argumento em um post publicado em 10 de setembro de 2026, citando o Zen do Python: "Explícito é melhor que implícito. Quem ler o nome prefixmatch() provavelmente entenderá a semântica pretendida."
Tanto a função no nível do módulo quanto o método dos padrões compilados recebem o novo nome. O re.Pattern.prefixmatch() acompanha o re.prefixmatch() na 3.15.
O que "obsoleto de forma branda" significa de verdade
A obsolescência branda é um processo específico definido na PEP 387, a política de compatibilidade retroativa do Python. Ela é bem mais fraca que uma obsolescência normal, e a diferença importa para quem mantém código antigo.
| Obsolescência branda | Obsolescência normal | |
|---|---|---|
| Aviso em tempo de execução | Nenhum | DeprecationWarning |
| Remoção agendada | Não | Sim, em uma versão definida |
| Continua documentada e testada | Sim | Sim, até a remoção |
| Recebe novos recursos | Não | Não |
A PEP 387 a define como "usar uma API que não deve mais ser usada para escrever código novo, mas que continua seguro usar em código existente". Ela também diz com clareza que a obsolescência branda "não emite aviso: é apenas mencionada na documentação".
Ou seja, o re.match() continua funcionando. Não há remoção agendada. Sua suíte de testes não vai começar a imprimir avisos ao migrar para a 3.15, e o python -W error não vai falhar por causa disso.
Qual das quatro usar
O módulo re agora oferece quatro formas de aplicar um padrão a uma string. Elas diferem apenas quanto ao lugar em que o padrão pode estar.
| Função | Corresponde | Adicionada na |
|---|---|---|
re.prefixmatch() | Somente no início | 3.15 |
re.match() | Somente no início, obsoleta de forma branda | 1.5 |
re.search() | Em qualquer ponto da string | 1.5 |
re.fullmatch() | A string inteira, do início ao fim | 3.4 |
O que isso significa para os desenvolvedores
Não há nada urgente a fazer. Esta é a rara mudança de API que não pede migração, não define prazo e não quebra código.
Em código novo na 3.15 ou posterior, escreva re.prefixmatch(). O nome diz a quem ler depois o que a chamada de fato faz, e é esse justamente o objetivo da mudança.
Para o código existente, o exercício útil não é um localizar e substituir. É uma auditoria. Cada chamada a re.match() na sua base de código é um ponto em que alguém pode ter querido dizer re.search(). Os testes não perceberiam isso se sempre passaram apenas entradas em que o padrão ficava no começo. Esses são erros reais anteriores à 3.15, e um grep rápido acha os candidatos mais depressa que qualquer ferramenta.
Tenha cuidado, porém, ao migrar direto para re.prefixmatch() numa biblioteca. Chamá-la faz o seu pacote exigir Python 3.15 ou mais recente, e re.match() é a grafia portátil entre versões até que a sua versão mínima suportada alcance esse patamar. Bases de código grandes convivem anos com essa diferença; os desenvolvedores do EVE Online começaram a migração para o Python 3 muito depois da separação de versões.
Vale reparar no sinal mais amplo. O time central do Python está disposto a gastar um nome novo e uma nota na documentação apenas para que uma API antiga seja lida corretamente, sem obrigar ninguém a mudar uma linha. Esse é um tipo barato de faxina, e quanto mais o Python fizer isso, menos retornos None silenciosos a próxima geração de desenvolvedores Python terá de depurar.
Fontes
- 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
Artigos relacionados

HTTP QUERY tem uma RFC, mas quase nenhuma implementação
A RFC 10008 deu ao HTTP um método QUERY em junho de 2026: seguro e idempotente como GET, com corpo de requisição como POST. Quase nada o implementa ainda.

EVE Online começa a mover 2,4 milhões de linhas de Python 2 para Python 3
A CCP Games diz que 95,9% dos 2,4 milhões de linhas do EVE já são analisados nas duas versões do Python. As 3.300 linhas restantes são as que travam a mudança.

Mojo passa a ser código aberto sob Apache 2.0, contribuições continuam fechadas
A Modular abriu o código do compilador e das ferramentas do Mojo sob Apache 2.0, uma semana após o Mojo 1.0, mas não aceitará contribuições externas ao compilador até o fim de 2026.