Python - expressões regulares
Uma expressão regular é uma sequência especial de caracteres que ajuda a encontrar ou encontrar outras strings ou conjuntos de strings, usando uma sintaxe especializada mantida em um padrão. As expressões regulares são amplamente utilizadas no mundo UNIX.
O módulo Python refornece suporte completo para expressões regulares semelhantes a Perl em Python. O módulo re levanta a exceção re.error se ocorrer um erro durante a compilação ou o uso de uma expressão regular.
Cobriríamos duas funções importantes, que seriam usadas para lidar com expressões regulares. Mas uma pequena coisa primeiro: Existem vários caracteres, que teriam um significado especial quando usados em expressões regulares. Para evitar qualquer confusão ao lidar com expressões regulares, usaríamos Raw Strings comor'expression'.
A função de correspondência
Esta função tenta corresponder o padrão RE à string com sinalizadores opcionais .
Aqui está a sintaxe para esta função -
re.match(pattern, string, flags=0)
Aqui está a descrição dos parâmetros -
Sr. Não. | 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 sinalizadores diferentes usando OR bit a bit (|). Esses são modificadores, que estão listados na tabela a seguir. |
A função re.match retorna ummatch objeto de sucesso, Noneem caso de falha. Usamos a função group (num) ou groups () dematch objeto para obter a expressão correspondente.
Sr. Não. | Método e descrição do objeto de correspondência |
---|---|
1 | group(num=0) Este método retorna a correspondência inteira (ou número de subgrupo específico) |
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, ele produz o seguinte resultado -
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
A função de pesquisa
Esta função procura a primeira ocorrência do padrão RE dentro da string com sinalizadores opcionais .
Aqui está a sintaxe para esta função -
re.search(pattern, string, flags=0)
Aqui está a descrição dos parâmetros -
Sr. Não. | 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 sinalizadores diferentes usando OR bit a bit (|). Esses são modificadores, que estão listados na tabela a seguir. |
A função re.search retorna ummatch objeto de sucesso, noneem caso de falha. Usamos a função group (num) ou groups () dematch objeto para obter a expressão correspondente.
Sr. Não. | Métodos e descrição do objeto de correspondência |
---|---|
1 | group(num=0) Este método retorna a correspondência inteira (ou número de subgrupo específico) |
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, ele produz o seguinte resultado -
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
Matching Versus Searching
Python oferece duas operações primitivas diferentes baseadas em expressões regulares: match verifica se há uma correspondência apenas no início da string, enquanto search verifica se há uma correspondência em qualquer lugar da string (é 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, ele produz o seguinte resultado -
No match!!
search --> searchObj.group() : dogs
Pesquisar e substituir
Um dos mais importantes re métodos que usam expressões regulares é sub.
Sintaxe
re.sub(pattern, repl, string, max=0)
Este método substitui todas as ocorrências do padrão RE na string por repl , substituindo todas as ocorrências, a menos que max seja fornecido. Este método retorna uma string modificada.
Exemplo
#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num
# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print "Phone Num : ", num
Quando o código acima é executado, ele produz o seguinte resultado -
Phone Num : 2004-959-559
Phone Num : 2004959559
Modificadores de expressão regular: sinalizadores de opção
Literais de expressão regular podem incluir um modificador opcional para controlar vários aspectos de correspondência. Os modificadores são especificados como um sinalizador opcional. Você pode fornecer vários modificadores usando OU exclusivo (|), conforme mostrado anteriormente e pode ser representado por um destes -
Sr. Não. | Modificador e descrição |
---|---|
1 | re.I Executa correspondência que não diferencia maiúsculas de minúsculas. |
2 | re.L Interpreta palavras de acordo com o local atual. Essa interpretação afeta o grupo alfabético (\ w e \ W), bem como o comportamento dos limites das palavras (\ 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 com que um ponto (ponto) corresponda a qualquer caractere, incluindo uma nova linha. |
5 | re.U Interpreta as letras de acordo com o conjunto de caracteres Unicode. Este sinalizador afeta o comportamento de \ w, \ W, \ b, \ B. |
6 | re.X Permite uma sintaxe de expressão regular "mais bonita". Ele ignora o espaço em branco (exceto dentro de um conjunto [] ou quando escapado por uma barra invertida) e trata # sem escape como um marcador de comentário. |
Padrões de Expressão Regular
Exceto para personagens de controle, (+ ? . * ^ $ ( ) [ ] { } | \), todos os personagens se combinam. Você pode escapar de um caractere de controle precedendo-o com uma barra invertida.
A tabela a seguir lista a sintaxe da expressão regular que está disponível em Python -
Sr. Não. | Padrão e Descrição |
---|---|
1 | ^ Corresponde ao início da linha. |
2 | $ Corresponde ao fim da linha. |
3 | . Corresponde a qualquer caractere único, exceto nova linha. Usar a opção m permite que ele corresponda a nova linha também. |
4 | [...] Corresponde a qualquer caractere único entre colchetes. |
5 | [^...] Corresponde a qualquer caractere único que não esteja entre colchetes |
6 | re* Corresponde a 0 ou mais ocorrências da expressão anterior. |
7 | re+ Corresponde a 1 ou mais ocorrências da expressão anterior. |
8 | re? Corresponde a 0 ou 1 ocorrência da expressão anterior. |
9 | re{ n} Corresponde exatamente ao número n de ocorrências da expressão anterior. |
10 | re{ n,} Corresponde a n ou mais ocorrências da expressão anterior. |
11 | re{ n, m} Corresponde a pelo menos n e no máximo m ocorrências da expressão anterior. |
12 | a| b Corresponde a a ou b. |
13 | (re) Agrupa expressões regulares e lembra o texto correspondente. |
14 | (?imx) Alterna temporariamente as opções i, m ou x em uma expressão regular. Se estiver entre parênteses, apenas essa área é afetada. |
15 | (?-imx) Desativa temporariamente as opções i, m ou x em uma expressão regular. Se estiver entre parênteses, apenas essa área é afetada. |
16 | (?: re) Agrupa expressões regulares sem lembrar o texto correspondente. |
17 | (?imx: re) Alterna temporariamente as opções i, m ou x entre parênteses. |
18 | (?-imx: re) Desativa temporariamente as opções i, m ou x entre parênteses. |
19 | (?#...) Comente. |
20 | (?= re) Especifica a posição usando um padrão. Não tem alcance. |
21 | (?! re) Especifica a posição usando negação de padrão. Não tem alcance. |
22 | (?> re) Corresponde ao padrão independente sem retrocesso. |
23 | \w Corresponde a caracteres de palavras. |
24 | \W Corresponde a caracteres que não sejam palavras. |
25 | \s Corresponde ao espaço em branco. Equivalente a [\ t \ n \ r \ f]. |
26 | \S Corresponde a espaços não brancos. |
27 | \d Corresponde aos dígitos. Equivalente a [0-9]. |
28 | \D Corresponde a nondigits. |
29 | \A Corresponde ao início da string. |
30 | \Z Corresponde ao final da string. Se houver uma nova linha, ela corresponderá imediatamente antes da nova linha. |
31 | \z Corresponde ao final da string. |
32 | \G As partidas apontam onde a última partida terminou. |
33 | \b Corresponde aos limites da palavra quando fora dos colchetes. Corresponde ao backspace (0x08) quando entre colchetes. |
34 | \B Corresponde a limites sem palavras. |
35 | \n, \t, etc. Corresponde a novas linhas, retornos de carro, guias, etc. |
36 | \1...\9 Corresponde à enésima subexpressão agrupada. |
37 | \10 Corresponde à enésima subexpressão agrupada, se já houver correspondência. Caso contrário, refere-se à representação octal de um código de caractere. |
Exemplos de expressão regular
Personagens literais
Sr. Não. | Exemplo e descrição |
---|---|
1 | python Corresponde a "python". |
Classes de personagens
Sr. Não. | Exemplo e descrição |
---|---|
1 | [Pp]ython Corresponde a "Python" ou "python" |
2 | rub[ye] Corresponde a "rubi" 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] Combine com qualquer uma das opções acima |
8 | [^aeiou] Corresponder a qualquer coisa que não seja uma vogal minúscula |
9 | [^0-9] Corresponde a qualquer coisa que não seja um dígito |
Classes de personagens especiais
Sr. Não. | 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 Corresponder a espaços não-brancos: [^ \ t \ r \ n \ f] |
6 | \w Corresponde a um caractere de palavra única: [A-Za-z0-9_] |
7 | \W Corresponde a um caractere diferente de palavra: [^ A-Za-z0-9_] |
Casos de Repetição
Sr. Não. | Exemplo e descrição |
---|---|
1 | ruby? Combine "esfregar" ou "rubi": o y é opcional |
2 | ruby* Corresponde a "esfregar" mais 0 ou mais ys |
3 | ruby+ Corresponde a "esfregar" mais 1 ou mais ys |
4 | \d{3} Corresponde exatamente a 3 dígitos |
5 | \d{3,} Corresponde 3 ou mais dígitos |
6 | \d{3,5} Corresponder 3, 4 ou 5 dígitos |
Repetição nongreedy
Isso corresponde ao menor número de repetições -
Sr. Não. | Exemplo e descrição |
---|---|
1 | <.*> Repetição gananciosa: corresponde a "<python> perl>" |
2 | <.*?> Nongreedy: corresponde a "<python>" em "<python> perl>" |
Agrupando com parênteses
Sr. Não. | Exemplo e descrição |
---|---|
1 | \D\d+ Nenhum grupo: + repete-se \ d |
2 | (\D\d)+ Agrupado: + repete \ D \ d par |
3 | ([Pp]ython(, )?)+ Corresponde a "Python", "Python, python, python" etc. |
Referências anteriores
Isso corresponde a um grupo anteriormente correspondido novamente -
Sr. Não. | Exemplo e descrição |
---|---|
1 | ([Pp])ython&\1ails Corresponder python e pails ou Python e Pails |
2 | (['"])[^\1]*\1 String entre aspas simples ou duplas. \ 1 corresponde a tudo o que o primeiro grupo correspondeu. \ 2 corresponde ao que o 2º grupo correspondeu, etc. |
Alternativas
Sr. Não. | Exemplo e descrição |
---|---|
1 | python|perl Corresponde a "python" ou "perl" |
2 | rub(y|le)) Corresponde a "rubi" ou "rublo" |
3 | Python(!+|\?) "Python" seguido por um ou mais! ou um? |
Âncoras
Isso precisa especificar a posição de correspondência.
Sr. Não. | 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 um limite de palavra |
6 | \brub\B \ B é um limite sem palavras: corresponde a "esfregar" 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 for seguido por um ponto de exclamação. |
Sintaxe especial com parênteses
Sr. Não. | Exemplo e descrição |
---|---|
1 | R(?#comment) Corresponde a "R". Todo o resto é um comentário |
2 | R(?i)uby Não diferencia maiúsculas de minúsculas enquanto corresponde a "uby" |
3 | R(?i:uby) O mesmo que acima |
4 | rub(?:y|le)) Grupo apenas sem criar \ 1 referência anterior |