Pitão

Expressões regulares usando Python 3

Expressões regulares usando Python 3
Expressões regulares são frequentemente vistas como uma série realmente obscura de hieróglifos que normalmente se copia da Internet e cola em seu código. Este feitiço misterioso então mostra capacidades mágicas de encontrar padrões dentro de strings de texto e se pedirmos gentilmente, ele nos fará o favor de substituir um determinado padrão dentro de uma string por algo mais agradável.

Por exemplo, quando você está escrevendo manipuladores para URL (e Deus o ajude se você estiver escrevendo um do zero), então você geralmente deseja exibir o mesmo resultado, independentemente do '/' final no URL. E.g https: // exemplo.com / usuário / configurações / e https: // exemplo.com / user / settings deve apontar para a mesma página, apesar do '/' final. 

No entanto, você não pode ignorar todas as barras, como:

  1. A barra entre 'usuário' e 'configurações', e, 'usuário / configurações'.
  2. Além disso, você deve levar em consideração o '//' no início do seu FQDN seguido por 'https'.

Então, você cria uma regra como: “Ignore apenas as barras seguidas de um espaço vazio.”E se você quiser, pode codificar essa regra com uma série de declarações if-else. Mas isso vai se tornar complicado rapidamente. Você pode escrever uma função dizendo cleanUrl () que pode encapsular isso para você. Mas o universo logo começará a jogar mais bolas curvas em você. Você logo se verá escrevendo funções para cleanHeaders (), processLog (), etc. Ou você pode usar uma expressão regular sempre que qualquer tipo de correspondência de padrão for necessária.

IO e arquivos padrão

Antes de entrarmos nos detalhes das expressões regulares, vale a pena mencionar o modelo que a maioria dos sistemas tem para fluxos de texto. Aqui está um breve (incompleto) resumo disso:

  1. O texto é processado como um (único) fluxo de caracteres.
  2. Este fluxo pode ser originado de um arquivo de texto Unicode ou ASCII ou de uma entrada padrão (teclado) ou de uma conexão de rede remota. Após o processamento, digamos por um script regex, a saída vai para um arquivo ou fluxo de rede ou para a saída padrão (e.g, console)
  3. O fluxo consiste em uma ou mais linhas. Cada linha tem zero ou mais caracteres seguidos por uma nova linha.

Para simplificar, quero que imagine que um arquivo é composto de linhas que terminam com um caractere de nova linha. Nós dividimos este arquivo em linhas individuais (ou strings), cada uma terminando com uma nova linha ou um caractere normal (para a última linha).

Regexs e String

Um regex não tem nada, em particular, a ver com arquivos. Imagine-o como uma caixa preta que pode receber como entrada qualquer string arbitrária de qualquer comprimento (finito) e, uma vez que chega ao final dessa string, pode:

  1. Aceite a string. Em outras palavras, a string fósforos a expressão regular (regex).
  2. Rejeite a corda, eu.e, a corda não partida a expressão regular (regex).

Apesar de sua natureza de caixa preta, acrescentarei mais algumas restrições a este mecanismo. Um regex lê uma string sequencialmente, da esquerda para a direita e lê apenas um caractere por vez. Então, uma corda “LinuxHint” com ser lido como:

'L "i" n "u" x "H" i "n" t' [Da esquerda para a direita]

Vamos começar simples

O tipo mais simplista de regex seria pesquisar e encontrar uma string 'C'. A expressão regular para isso é apenas 'C'. Bastante trivial. A maneira de fazer isso em Python exigiria que você primeiro importasse o módulo para expressões regulares.

>>> importação re

Em seguida, usamos a função re.procurar(padrão, corda) Onde padronizar é a nossa expressão regular e fragmento na string de entrada na qual procuramos o padrão.

>>> re.pesquisa ('C', 'Esta frase tem um C deliberado nela')

A função pega o padrão 'C', procura por ele na string de entrada e imprime a localização (span) onde o referido padrão é encontrado. Esta parte da string, esta substring é o que corresponde à nossa expressão regular. Se não houvesse correspondência encontrada, a saída seria um Nenhum objeto.

Da mesma forma, você pode pesquisar o padrão 'expressão regular' da seguinte maneira:

>>> re.search (“expressão regular”, “Podemos usar expressões regulares para pesquisar padrões.”)

ré.search (), re.combinar () e re.fullmatch ()

Três funções úteis do módulo re incluem:

1.  ré.procurar(padrão, corda)

Isso retorna a substring que corresponde ao padrão, como vimos acima. Se nenhuma correspondência for encontrada, então Nenhum é devolvido. Se várias substrings estão em conformidade com um determinado padrão, apenas a primeira ocorrência é relatada.

2.  ré.partida(padrão, corda)

Esta função tenta corresponder ao padrão fornecido desde o início da string. Se encontrar uma quebra em algum lugar no meio do caminho, ele retorna Nenhum.

Por exemplo,

>>> re.correspondência ("Joh", "John Doe")

Onde, como a string "Meu nome é John Doe" não é uma correspondência e, portanto, Nenhum é devolvido.

>>> imprimir (re.correspondência (“Joh”, “Meu nome é John Doe”))
Nenhum

3.  ré.fullmatch (padrão, corda)

Isso é mais rígido do que os anteriores e tenta encontrar uma correspondência exata do padrão na string, caso contrário, o padrão é Nenhum.

>>> imprimir (re.fullmatch ("Joh", "Joh"))

# Qualquer outra coisa não será uma correspondência

Estarei usando apenas o ré.procurar() função no resto deste artigo. Sempre que digo que a regex aceita essa string, isso significa que ré.procurar() função encontrou uma substring correspondente na string de entrada e a retornou, em vez de Nenhumobjeto.

Caracteres especiais

Expressões regulares como 'John' e 'C' não são muito úteis. Precisamos de caracteres especiais com um significado específico no contexto de expressões regulares. Aqui estão alguns exemplos:

    1. ^ - Corresponde ao início de uma string. Por exemplo, '^ C' corresponderá a todas as strings que começam com a letra C.
    2. $ - Corresponde ao fim da linha.
    3. . - O ponto é para indicar um ou mais caracteres, exceto a nova linha.
    4. * - Isto é para zero ou mais caracteres do que o precedeu. Portanto, b * corresponde a 0 ou mais ocorrências de b. ab * corresponde apenas a a, ab e a
    5. + - Este é um ou mais caracteres do que o precedeu. Portanto, b + corresponde a 1 ou mais ocorrências de b. ab * corresponde apenas a a, ab e a
    6. \ - Barra invertida é usada como sequência de escape nas expressões regulares. Portanto, se você deseja uma expressão regular para pesquisar a presença literal do símbolo de cifrão '$' em vez do fim da linha. Você pode escrever \ $ em uma expressão regular.
    7. Os colchetes podem ser usados ​​para especificar o número de repetições que você deseja ver. Por exemplo, um padrão como ab 10 significa que a string a seguida por 10 b corresponderá a este padrão. Você também pode especificar um intervalo de números, como b 4,6 corresponde a strings contendo b repetido de 4 a 6 vezes consecutivamente. O padrão para 4 ou mais repetições exigiria apenas uma vírgula final, como b 4,
    8. Colchetes e intervalo de caracteres. RE como [0-9] pode atuar como um espaço reservado para qualquer dígito entre 0 e 9. Da mesma forma, você pode ter dígitos entre um e cinco [1-5] ou para corresponder a qualquer letra maiúscula use [A-Z] ou para qualquer letra do alfabeto, independentemente de ser maiúscula ou minúscula, use [A-z].
      Por exemplo, qualquer string composta por exatamente dez dígitos corresponde à expressão regular [0-9] 10, bastante útil quando você está procurando por números de telefone em uma determinada string.
    9. Você pode criar uma instrução OR like, usando | caractere em que uma expressão regular é composta de duas ou mais expressões regulares, digamos, A e B. A regex A | B é uma correspondência se a string de entrada for uma correspondência para a expressão regular A ou para B.
    10. Você pode agrupar diferentes regexes. Por exemplo, o regex (A | B) C corresponderá a regexes para AC e

Há muito mais para cobrir, mas eu recomendaria aprender conforme você avança, em vez de sobrecarregar seu cérebro com muitos símbolos obscuros e casos extremos. Em caso de dúvida, os documentos Python são uma grande ajuda e agora você sabe o suficiente para seguir os documentos facilmente.

Experiência prática e referências

Se você quiser ver uma interpretação visual de seu regex, você pode visitar Debuggex. Este site gera uma visão de seu regex em tempo real e permite testá-lo em várias strings de entrada.

Para saber mais sobre o aspecto teórico das Expressões Regulares, você pode consultar os primeiros capítulos de Introdução à Teoria da Computação, de Michael Sipser. É muito fácil de seguir e mostra a importância das expressões regulares como um conceito central da própria computação!

OpenTTD vs Simutrans
Criar sua própria simulação de transporte pode ser divertido, relaxante e extremamente atraente. É por isso que você precisa ter certeza de experiment...
Tutorial OpenTTD
OpenTTD é um dos jogos de simulação de negócios mais populares que existem. Neste jogo, você precisa criar um maravilhoso negócio de transporte. No en...
SuperTuxKart para Linux
SuperTuxKart é um ótimo título projetado para trazer a você a experiência Mario Kart gratuitamente em seu sistema Linux. É bastante desafiador e diver...