Python Regex ganancioso

Resumo : neste tutorial, você aprenderá sobre o modo ganancioso da regex do Python e como alterar o modo de ganancioso para não ganancioso.

Por padrão, todos os quantificadores funcionam em modo ganancioso. Isso significa que os quantificadores tentarão corresponder ao máximo possível aos elementos anteriores.

Vamos começar com um exemplo para entender como funciona o modo guloso de regex.

O resultado inesperado com o modo ganancioso

Suponha que você tenha o seguinte fragmento HTML que representa um elemento de botão:

s = '<button type="submit" class="btn">Send</button>'Linguagem de código:  Python  ( python )

E você deseja combinar os textos entre aspas ( "") como submite btn.

Para fazer isso, você pode criar o seguinte padrão que inclui a aspa (“), o conjunto de caracteres. ponto ( ) e o quantificador ( ) :+

".+"Linguagem de código:  Python  ( python )

O significado do padrão é o seguinte:

  • "começa com uma citação
  • .corresponde a qualquer caractere, exceto a nova linha
  • +corresponde ao caractere anterior uma ou mais vezes
  • "termina com uma citação

O seguinte usa a finditer()função para combinar a string scom o padrão:

import re

s = '<button type="submit" class="btn">Send</button>'

pattern = '".+"'
matches = re.finditer(pattern, s)

for match in matches:
    print(match.group())Linguagem de código:  Python  ( python )

O programa exibe o seguinte resultado:

"submit" class="btn"Linguagem de código:  Python  ( python )

O resultado não é o que você esperava.

Por padrão, o quantificador (+) é executado no modo guloso, no qual tenta corresponder o elemento anterior ( ".) tanto quanto possível.

Como funciona o modo ganancioso de regex do Python

Primeiro, o mecanismo regex começa a corresponder a partir do primeiro caractere da string s.

Em seguida, como o primeiro caractere <não corresponde à aspa ( "), o mecanismo regex continua a corresponder aos próximos caracteres até atingir a primeira aspa ( "):

Em seguida, o mecanismo regex examina o padrão e combina a string com a próxima regra .+.

Como a .+regra corresponde a um caractere uma ou mais vezes, o mecanismo regex corresponde a todos os caracteres até chegar ao final da string:

Depois disso, o mecanismo regex examina a última regra do padrão, que é uma aspa (“). Porém, já chega ao final da string. Não há mais personagem para combinar. É muito ganancioso ir longe demais.

Finalmente, o mecanismo regex volta do final da string para encontrar a aspa (“). Esta etapa é chamada de retrocesso .

Como resultado, a correspondência é a seguinte substring, que não é o que esperávamos:

"submit" class="btn"Linguagem de código:  Python  ( python )

Para corrigir esse problema, você precisa instruir o quantificador ( +) para usar o modo não ganancioso (ou preguiçoso) em vez do modo ganancioso.

Para fazer isso, você adiciona um ponto de interrogação ( ?) após o quantificador assim:

".+?"Linguagem de código:  Python  ( python )

O programa a seguir retorna o resultado esperado:

import re

s = '<button type="submit" class="btn">Send</button>'

pattern = '".+?"'
matches = re.finditer(pattern, s)

for match in matches:
    print(match.group())Linguagem de código:  Python  ( python )

Saída:

"submit"
"btn"Linguagem de código:  Python  ( python )

Resumo

  • Por padrão, todos os quantificadores usam o modo ganancioso.
  • Os quantificadores gananciosos corresponderão tanto quanto possível aos seus elementos anteriores.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *