Expressões regulares usando Python 3

Expressões regulares usando Python 3
Expressões regulares são frequentemente vistas como essa série realmente obscura de hieróglifos que normalmente copia da Internet e pastas em seu código. Esse feitiço misterioso mostra capacidades mágicas de encontrar padrões dentro de seqüências de texto e, se perguntarmos bem, ele até nos fará o favor de substituir um determinado padrão em uma corda por algo melhor.

Por exemplo, quando você está escrevendo manipuladores para URL (e Deus o ajude se você estiver escrevendo um do zero), muitas vezes você deseja exibir o mesmo resultado, independentemente da trilha '/' no URL. E.g https: // Exemplo.com/user/configurações/e https: // Exemplo.com/usuário/configurações devem apontar para a mesma página, apesar da direita '/'.

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

  1. A barra para frente entre 'Usuário' e 'Configurações', e, 'Usuário/Configurações'.
  2. Além disso, você terá que 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 para a frente seguidas de espaço vazio.”E se você quiser, pode codificar essa regra com uma série de declarações if-else. Mas isso ficará pesado rapidamente. Você pode escrever uma função dizendo limpeurl () que pode encapsular isso para você. Mas o universo logo começará a jogar mais bolas de curva em você. Em breve você se encontrará 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 padrão e arquivos

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 resumo curto (incompleto) dele:

  1. O texto é processado como um (único) fluxo de caracteres.
  2. Este fluxo pode se originar de um arquivo de texto Unicode ou ASCII ou de 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 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.

Por uma questão de simplicidade, quero que você imagine que um arquivo é composto por linhas que terminam com um personagem de nova linha. Quebramos esse arquivo em linhas individuais (ou strings), cada um terminando com uma nova linha ou um caractere normal (para a última linha).

Regexs e string

Um regex não tem nada, particular, a ver com arquivos. Imagine -o como uma caixa preta que pode tomar como entrada qualquer sequência arbitrária de qualquer comprimento (finito) e, quando atingir o final desta string, ele pode:

  1. Aceite a string. Em outras palavras, a corda partidas a expressão regular (regex).
  2. Rejeitar a string, eu.E, a corda não corresponder a expressão regular (regex).

Apesar de sua natureza preta de caixa, adicionarei mais algumas restrições a essa máquina. Um regex lê uma string sequencialmente, Da esquerda para a direita, e lê apenas um personagem de cada vez. Então uma string “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 procurar e combinar uma string 'c'. A expressão regular para isso é apenas 'C'. Bastante trivial. A maneira de fazê -lo em Python exigiria que você importe primeiro o módulo para expressões regulares.

>>> Importar re

Em seguida, usamos a função re.procurar(padrão, string) onde padrão é nossa expressão regular e corda na sequência de entrada na qual procuramos o padrão.

>>> re.Search ('C', 'Esta frase tem um C deliberado nele')

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

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

>>> re.Pesquise (“Expressão regular”, “Podemos usar expressões regulares para padrões de pesquisa.”)

ré.pesquisa (), re.Match () e Re.FullMatch ()

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

ré.procurar(padrão, string)

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 substâncias substituras estão em conformidade com um determinado padrão, apenas a primeira ocorrência é relatada.

ré.corresponder(padrão, string)

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

Por exemplo,

>>> re.Match ("Joh", "John Doe")

Onde, como a string, "meu nome é John Doe" não é uma partida e, portanto, Nenhum é devolvido.

>>> Imprimir (re.Match ("Joh", "Meu nome é John Doe")))
Nenhum

ré.FullMatch (padrão, string)

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

>>> Imprimir (re.Fullmatch ("Joh", "Joh"))))

# Qualquer outra coisa não será uma partida

Eu estarei usando apenas o ré.procurar() função no restante deste artigo. Sempre que digo que a regex aceita essa string, significa que Athe ré.procurar() A função encontrou uma substring correspondente na sequência de entrada e retornou isso, em vez de Nenhumobjeto.

Caracteres especiais

Expressões regulares como 'John' e 'C' não são de muita utilidade. Precisamos de caracteres especiais que um meio específico no contexto de expressões regulares. Aqui estão alguns exemplos:

    1. ^ - Isso corresponde ao início de uma corda. Por exemplo, '^c' corresponderá a todas as cordas que começam com a letra C.
    2. $ - isso corresponde ao fim da linha.
    3. . - O ponto é indicar um ou mais caracteres, exceto a nova linha.
    4. * - isso é para zero ou mais caráter do que precedeu. Então B* corresponde a 0 ou mais ocorrências de B. ab* corresponde apenas a, ab e um
    5. + - Isso é para um ou mais caráter do que o precedeu. Então B+ corresponde a 1 ou mais ocorrências de B. ab* corresponde apenas a, ab e um
    6. \ - A barriga é usada como sequência de escape nas regexes. Portanto, você quer uma expressão regular para procurar a presença literal de símbolo do dólar '$' em vez do fim da linha. Você pode escrever \ $ na expressão regular.
    7. Aparelhos encaracolados podem ser usados ​​para especificar o número de repetições que você deseja ver. Por exemplo, um padrão como ab 10 significa a string a seguida por 10 b corresponderá a esse padrão. Você também pode especificar uma série de números, como B 4,6 corresponde a strings contendo B repetido 4 a 6 vezes consecutivamente. O padrão para 4 ou mais repetições exigiria apenas uma vírgula à direita, como So B 4,
    8. Suportes quadrados e variedade de personagens. Como [0-9] pode agir 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 uppercase usar [a-z] ou para qualquer letra do alfabeto, independentemente de ser o uso superior ou minúsculo [a-z].
      Por exemplo, qualquer string feita de exatamente dez dígitos corresponde à expressão regular [0-9] 10, bastante útil quando você está procurando números de telefone em uma determinada string.
    9. Você pode criar uma declaração ou semelhante, usando | caráter em que uma expressão regular é composta de duas ou mais expressões regulares, digamos, A e B. O regex A | B é uma correspondência se a sequência 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á às regexes para CA e

Há muito mais para cobrir, mas eu recomendaria aprender como você avança, em vez de sobrecarregar seu cérebro com muitos símbolos obscuros e casos de borda. 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 e referências práticas

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

Para saber mais sobre o aspecto teórico das expressões regulares, você pode querer olhar para os primeiros dois capítulos de introdução à teoria da computação por Michael Sipser. É muito fácil de seguir e mostra a importância das expressões regulares como um conceito central de computação em si!