Expressões Regulares em Python: Guia Prático
Uma expressão regular é uma sequência especial de caracteres que ajuda você a corresponder ou encontrar outras strings ou conjuntos de strings, usando uma sintaxe especializada mantida em um padrão. Expressões regulares são amplamente usadas no mundo UNIX.
O módulo Python re fornece suporte completo para expressões regulares estilo Perl no Python. O módulo re levanta a exceção re.error se ocorrer um erro durante a compilação ou uso de uma expressão regular.
Cobriremos duas funções importantes, que serão usadas para lidar com expressões regulares. Mas primeiro uma pequena coisa: Existem vários caracteres que teriam significado especial quando usados em expressão regular. Para evitar qualquer confusão ao lidar com expressões regulares, usaremos Raw Strings como r'expression'.
A Função match
Esta função tenta corresponder o padrão RE pattern à string com flags opcionais.
Aqui está a sintaxe para esta função:
re.match(pattern, string, flags=0)
Descrição dos parâmetros:
| Nº | Parâmetro e Descrição |
|---|---|
| 1 | pattern Esta é a expressão regular a ser correspondida. |
| 2 | string Esta é a string que seria pesquisada para corresponder ao padrão no início da string. |
| 3 | flags Você pode especificar diferentes flags usando OR bit a bit (|). Estes são modificadores, listados na tabela abaixo. |
A função re.match retorna um objeto match em caso de sucesso, None em caso de falha. Usamos group(num) ou groups() função do objeto match para obter a expressão correspondida.
| Nº | Método do Objeto Match e Descrição |
|---|---|
| 1 | group(num=0) Este método retorna a correspondência inteira (ou subgrupo específico num) |
| 2 | groups() Este método retorna todos os subgrupos correspondentes em uma tupla (vazio se não houver nenhum) |
Exemplo
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print("matchObj.group() : ", matchObj.group())
print("matchObj.group(1) : ", matchObj.group(1))
print("matchObj.group(2) : ", matchObj.group(2))
else:
print("No match!!")
Quando o código acima é executado, produz o seguinte resultado:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
A Função search
Esta função procura a primeira ocorrência do padrão RE pattern dentro de string com flags opcionais.
Aqui está a sintaxe para esta função:
re.search(pattern, string, flags=0)
Descrição dos parâmetros:
| Nº | Parâmetro e Descrição |
|---|---|
| 1 | pattern Esta é a expressão regular a ser correspondida. |
| 2 | string Esta é a string que seria pesquisada para corresponder ao padrão em qualquer lugar da string. |
| 3 | flags Você pode especificar diferentes flags usando OR bit a bit (|). Estes são modificadores, listados na tabela abaixo. |
A função re.search retorna um objeto match em caso de sucesso, None em caso de falha. Usamos group(num) ou groups() função do objeto match para obter a expressão correspondida.
| Nº | Métodos do Objeto Match e Descrição |
|---|---|
| 1 | group(num=0) Este método retorna a correspondência inteira (ou subgrupo específico num) |
| 2 | groups() Este método retorna todos os subgrupos correspondentes em uma tupla (vazio se não houver nenhum) |
Exemplo
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print("searchObj.group() : ", searchObj.group())
print("searchObj.group(1) : ", searchObj.group(1))
print("searchObj.group(2) : ", searchObj.group(2))
else:
print("Nothing found!!")
Quando o código acima é executado, produz o seguinte resultado:
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
Correspondência vs Busca
O Python oferece duas operações primitivas diferentes baseadas em expressões regulares: match verifica correspondência apenas no início da string, enquanto search verifica correspondência em qualquer lugar da string (isso é o que o Perl faz por padrão).
Exemplo
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match(r'dogs', line, re.M|re.I)
if matchObj:
print("match --> matchObj.group() : ", matchObj.group())
else:
print("No match!!")
searchObj = re.search(r'dogs', line, re.M|re.I)
if searchObj:
print("search --> searchObj.group() : ", searchObj.group())
else:
print("Nothing found!!")
Quando o código acima é executado, produz o seguinte resultado:
No match!!
search --> searchObj.group() : dogs
Busca e Substituição
Um dos métodos mais importantes do re que usa expressões regulares é sub.
Sintaxe
re.sub(pattern, repl, string, max=0)
Este método substitui todas as ocorrências do padrão RE pattern em string com repl, substituindo todas as ocorrências a menos que max seja fornecido. Este método retorna a string modificada.
Exemplo
#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Deleta comentários estilo Python
num = re.sub(r'#.*$', "", phone)
print("Phone Num : ", num)
# Remove qualquer coisa que não seja dígitos
num = re.sub(r'\D', "", phone)
print("Phone Num : ", num)
Quando o código acima é executado, produz o seguinte resultado:
Phone Num : 2004-959-559
Phone Num : 2004959559
Modificadores de Expressão Regular: Flags de Opção
Literais de expressão regular podem incluir um modificador opcional para controlar vários aspectos da correspondência. Os modificadores são especificados como uma flag opcional. Você pode fornecer múltiplos modificadores usando OR exclusivo (|), como mostrado anteriormente e podem ser representados por um destes:
| Nº | Modificador e Descrição |
|---|---|
| 1 | re.I Realiza correspondência insensível a maiúsculas/minúsculas. |
| 2 | re.L Interpreta palavras de acordo com o locale atual. Esta interpretação afeta o grupo alfabético (\w e \W), bem como comportamento de fronteira de palavra (\b e \B). |
| 3 | re.M Faz $ corresponder ao final de uma linha (não apenas ao final da string) e faz ^ corresponder ao início de qualquer linha (não apenas ao início da string). |
| 4 | re.S Faz um ponto (ponto) corresponder a qualquer caractere, incluindo nova linha. |
| 5 | re.U Interpreta letras de acordo com o conjunto de caracteres Unicode. Esta flag afeta o comportamento de \w, \W, \b, \B. |
| 6 | re.X Permite sintaxe de expressão regular "mais bonita". Ignora espaços em branco (exceto dentro de um conjunto [] ou quando escapado por uma barra invertida) e trata # não escapado como marcador de comentário. |
Padrões de Expressão Regular
Exceto para caracteres de controle, (+ ? . * ^ $ ( ) [ ] { } | \), todos os caracteres correspondem a si mesmos. Você pode escapar um caractere de controle precedendo-o com uma barra invertida.
A tabela a seguir lista a sintaxe de expressão regular disponível no Python:
| Nº | Padrão e Descrição |
|---|---|
| 1 | ^ Corresponde ao início da linha. |
| 2 | $ Corresponde ao final da linha. |
| 3 | . Corresponde a qualquer caractere único exceto nova linha. Usando a opção m permite que corresponda a nova linha também. |
| 4 | [...] Corresponde a qualquer caractere único entre colchetes. |
| 5 | [^...] Corresponde a qualquer caractere único não entre colchetes. |
| 6 | re* Corresponde a 0 ou mais ocorrências da expressão precedente. |
| 7 | re+ Corresponde a 1 ou mais ocorrências da expressão precedente. |
| 8 | re? Corresponde a 0 ou 1 ocorrência da expressão precedente. |
| 9 | re{ n} Corresponde exatamente n número de ocorrências da expressão precedente. |
| 10 | re{ n,} Corresponde a n ou mais ocorrências da expressão precedente. |
| 11 | re{ n, m} Corresponde a pelo menos n e no máximo m ocorrências da expressão precedente. |
| 12 | a| b Corresponde a a ou b. |
| 13 | (re) Agrupa expressões regulares e lembra o texto correspondido. |
| 14 | (?imx) Alterna temporariamente opções i, m ou x dentro de uma expressão regular. Se entre parênteses, apenas essa área é afetada. |
| 15 | (?-imx) Desliga temporariamente opções i, m ou x dentro de uma expressão regular. Se entre parênteses, apenas essa área é afetada. |
| 16 | (?: re) Agrupa expressões regulares sem lembrar o texto correspondido. |
| 17 | (?imx: re) Alterna temporariamente opções i, m ou x dentro de parênteses. |
| 18 | (?-imx: re) Desliga temporariamente opções i, m ou x dentro de parênteses. |
| 19 | (?#...) Comentário. |
| 20 | (?= re) Especifica posição usando um padrão. Não tem alcance. |
| 21 | (?! re) Especifica posição usando negação de padrão. Não tem alcance. |
| 22 | (?> re) Corresponde a padrão independente sem backtracking. |
| 23 | \w Corresponde a caracteres de palavra. |
| 24 | \W Corresponde a não caracteres de palavra. |
| 25 | \s Corresponde a espaços em branco. Equivale a [\t\n\r\f]. |
| 26 | \S Corresponde a não espaços em branco. |
| 27 | \d Corresponde a dígitos. Equivale a [0-9]. |
| 28 | \D Corresponde a não dígitos. |
| 29 | \A Corresponde ao início da string. |
| 30 | \Z Corresponde ao final da string. Se uma nova linha existe, corresponde logo antes da nova linha. |
| 31 | \z Corresponde ao final da string. |
| 32 | \G Corresponde ao ponto onde a última correspondência terminou. |
| 33 | \b Corresponde a fronteiras de palavra quando fora de colchetes. Corresponde a backspace (0x08) quando dentro de colchetes. |
| 34 | \B Corresponde a não fronteiras de palavra. |
| 35 | \n, \t, etc. Corresponde a novas linhas, carriage returns, tabs, etc. |
| 36 | \1...\9 Corresponde a n-ésima subexpressão agrupada. |
| 37 | \10 Corresponde a n-ésima subexpressão agrupada se já correspondeu. Caso contrário, refere-se à representação octal de um código de caractere. |
Exemplos de Expressões Regulares
Caracteres literais
| Nº | Exemplo e Descrição |
|---|---|
| 1 | python Corresponde a "python". |
Classes de caracteres
| Nº | Exemplo e Descrição |
|---|---|
| 1 | [Pp]ython Corresponde a "Python" ou "python" |
| 2 | rub[ye] Corresponde a "ruby" ou "rube" |
| 3 | [aeiou] Corresponde a qualquer vogal minúscula |
| 4 | [0-9] Corresponde a qualquer dígito; igual a [0123456789] |
| 5 | [a-z] Corresponde a qualquer letra ASCII minúscula |
| 6 | [A-Z] Corresponde a qualquer letra ASCII maiúscula |
| 7 | [a-zA-Z0-9] Corresponde a qualquer um dos acima |
| 8 | [^aeiou] Corresponde a qualquer coisa exceto vogal minúscula |
| 9 | [^0-9] Corresponde a qualquer coisa exceto dígito |
Classes de Caracteres Especiais
| Nº | Exemplo e Descrição |
|---|---|
| 1 | . Corresponde a qualquer caractere exceto nova linha |
| 2 | \d Corresponde a um dígito: [0-9] |
| 3 | \D Corresponde a um não dígito: [^0-9] |
| 4 | \s Corresponde a um caractere de espaço em branco: [ \t\r\n\f] |
| 5 | \S Corresponde a não espaço em branco: [^ \t\r\n\f] |
| 6 | \w Corresponde a um único caractere de palavra: [A-Za-z0-9_] |
| 7 | \W Corresponde a um não caractere de palavra: [^A-Za-z0-9_] |
Casos de Repetição
| Nº | Exemplo e Descrição |
|---|---|
| 1 | ruby? Corresponde a "rub" ou "ruby": o y é opcional |
| 2 | ruby* Corresponde a "rub" mais 0 ou mais ys |
| 3 | ruby+ Corresponde a "rub" mais 1 ou mais ys |
| 4 | \d{3} Corresponde exatamente a 3 dígitos |
| 5 | \d{3,} Corresponde a 3 ou mais dígitos |
| 6 | \d{3,5} Corresponde a 3, 4 ou 5 dígitos |
Repetição Não Gulosa
Isso corresponde ao menor número de repetições:
| Nº | Exemplo e Descrição |
|---|---|
| 1 | <.*> Repetição gulosa: corresponde a "<python>perl>" |
| 2 | <.*?> Não gulosa: corresponde a "<python>" em "<python>perl>" |
Agrupamento com Parênteses
| Nº | Exemplo e Descrição |
|---|---|
| 1 | \D\d+ Sem grupo: + repete \d |
| 2 | (\D\d)+ Agrupado: + repete par \D\d |
| 3 | ([Pp]ython(, )?)+ Corresponde a "Python", "Python, python, python", etc. |
Backreferences
Isso corresponde a um grupo previamente correspondido novamente:
| Nº | Exemplo e Descrição |
|---|---|
| 1 | ([Pp])ython\1ails Corresponde a python\1ails ou Python\1ails |
| 2 | (['"])[^\1]*\1 String com aspas simples ou duplas. \1 corresponde ao que o 1º grupo correspondeu. \2 corresponde ao que o 2º grupo correspondeu, etc. |
Alternativas
| Nº | Exemplo e Descrição |
|---|---|
| 1 | python|perl Corresponde a "python" ou "perl" |
| 2 | rub(y|le) Corresponde a "ruby" ou "ruble" |
| 3 | Python(!+|\?) "Python" seguido por um ou mais ! ou um ? |
Âncoras
Isso precisa especificar posição de correspondência.
| Nº | Exemplo e Descrição |
|---|---|
| 1 | ^Python Corresponde a "Python" no início de uma string ou linha interna |
| 2 | Python$ Corresponde a "Python" no final de uma string ou linha |
| 3 | \APython Corresponde a "Python" no início de uma string |
| 4 | Python\Z Corresponde a "Python" no final de uma string |
| 5 | \bPython\b Corresponde a "Python" em uma fronteira de palavra |
| 6 | \brub\B \B é não fronteira de palavra: corresponde a "rub" em "rube" e "ruby" mas não sozinho |
| 7 | Python(?=!) Corresponde a "Python", se seguido por um ponto de exclamação. |
| 8 | Python(?!\!) Corresponde a "Python", se não seguido por um ponto de exclamação. |
Sintaxe Especial com Parênteses
| Nº | Exemplo e Descrição |
|---|---|
| 1 | R(?#comment) Corresponde a "R". Todo o resto é comentário |
| 2 | R(?i)uby Insensível a maiúsculas/minúsculas ao corresponder "uby" |
| 3 | R(?i:uby) Igual ao anterior |
| 4 | rub(?:y|le) Agrupa apenas sem criar backreference \1 |
python
- Dominando Tipos de Dados em Python: Guia Prático
- Dominando Operadores em Python: Guia Completo
- Dominando a Declaração Pass em Python: Guia Prático
- Dominando Argumentos de Funções em Python: Parâmetros Posicionais, Nomeados e Padrão
- Dominando Dicionários em Python: Criação, Manipulação e Técnicas Avançadas
- Dominando Iteradores em Python: Como Funcionam e Como Criar os Seus
- Closures em Python Explicados: Como Funções Aninhadas Capturam Variáveis
- Expressões Regulares em Python (Módulo re) – Guia Prático
- Dominando datetime do Python: Guia Prático de Datas, Horários e Fusos Horários
- Expressões Regulares em Java: Dominando Correspondência de Padrões com java.util.regex