Perl - Expressões regulares
Uma expressão regular é uma sequência de caracteres que define o padrão ou padrões que você está visualizando. A sintaxe das expressões regulares em Perl é muito semelhante ao que você encontrará em outros programas de suporte de expressões regulares, comosed, grep, e awk.
O método básico para aplicar uma expressão regular é usar os operadores de associação de padrão = ~ e !~. O primeiro operador é um operador de teste e atribuição.
Existem três operadores de expressão regular em Perl.
- Corresponder à expressão regular - m //
- Substituir Expressão Regular - s ///
- Transliterar Expressão Regular - tr ///
As barras em cada caso atuam como delimitadores para a expressão regular (regex) que você está especificando. Se você se sentir confortável com qualquer outro delimitador, poderá usar no lugar da barra.
O Operador da Partida
O operador de correspondência, m //, é usado para fazer a correspondência de uma string ou instrução com uma expressão regular. Por exemplo, para combinar a sequência de caracteres "foo" com a barra escalar $, você pode usar uma instrução como esta -
#!/usr/bin/perl
$bar = "This is foo and again foo";
if ($bar =~ /foo/) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo";
if ($bar =~ /foo/) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
Quando o programa acima é executado, ele produz o seguinte resultado -
First time is matching
Second time is matching
OM // realmente funciona da mesma maneira que a série de operadores q //. Você pode usar qualquer combinação de caracteres naturalmente correspondentes para atuar como delimitadores para a expressão. Por exemplo, m {}, m () e m> <são todos válidos. Portanto, o exemplo acima pode ser reescrito da seguinte forma -
#!/usr/bin/perl
$bar = "This is foo and again foo";
if ($bar =~ m[foo]) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo";
if ($bar =~ m{foo}) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
Você pode omitir m de m // se os delimitadores forem barras, mas para todos os outros delimitadores você deve usar o prefixo m.
Observe que toda a expressão de correspondência, que é a expressão à esquerda de = ~ ou! ~ E o operador de correspondência, retorna verdadeiro (em um contexto escalar) se a expressão corresponder. Portanto, a declaração -
$true = ($foo =~ m/foo/);
definirá $ true como 1 se $ foo corresponder à regex, ou 0 se a correspondência falhar. Em um contexto de lista, a correspondência retorna o conteúdo de quaisquer expressões agrupadas. Por exemplo, ao extrair as horas, minutos e segundos de uma string de tempo, podemos usar -
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
Modificadores do operador de correspondência
O operador match suporta seu próprio conjunto de modificadores. O modificador / g permite correspondência global. O modificador / i tornará a correspondência insensível a maiúsculas e minúsculas. Aqui está a lista completa de modificadores
Sr. Não. | Modificador e descrição |
---|---|
1 | i Torna a correspondência insensível a maiúsculas e minúsculas. |
2 | m Especifica que se a string tiver caracteres de nova linha ou de retorno de carro, os operadores ^ e $ agora corresponderão a um limite de nova linha, em vez de um limite de string. |
3 | o Avalia a expressão apenas uma vez. |
4 | s Permite o uso de. para corresponder a um caractere de nova linha. |
5 | x Permite que você use espaços em branco na expressão para maior clareza. |
6 | g Encontra globalmente todas as correspondências. |
7 | cg Permite que a pesquisa continue mesmo após a falha de uma correspondência global. |
Correspondência apenas uma vez
Também existe uma versão mais simples do operador de correspondência - o? PATTERN? operador. Ele é basicamente idêntico ao operador m //, exceto que só corresponde uma vez dentro da string que você está procurando entre cada chamada para redefinir.
Por exemplo, você pode usar isso para obter o primeiro e o último elementos de uma lista -
#!/usr/bin/perl
@list = qw/food foosball subeo footnote terfoot canic footbrdige/;
foreach (@list) {
$first = $1 if /(foo.*?)/;
$last = $1 if /(foo.*)/;
}
print "First: $first, Last: $last\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
First: foo, Last: footbrdige
Variáveis de Expressão Regular
Variáveis de expressão regular incluem $, que contém a última correspondência de agrupamento correspondida; $&, que contém toda a string combinada; $`, que contém tudo antes da string correspondente; e$', que contém tudo após a string correspondente. O código a seguir demonstra o resultado -
#!/usr/bin/perl
$string = "The food is in the salad bar";
$string =~ m/foo/;
print "Before: $`\n";
print "Matched: $&\n";
print "After: $'\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
Before: The
Matched: foo
After: d is in the salad bar
O Operador de Substituição
O operador de substituição, s ///, é realmente apenas uma extensão do operador de correspondência que permite substituir o texto correspondido por algum novo texto. A forma básica do operador é -
s/PATTERN/REPLACEMENT/;
O PADRÃO é a expressão regular para o texto que procuramos. O REPLACEMENT é uma especificação para o texto ou expressão regular que queremos usar para substituir o texto encontrado. Por exemplo, podemos substituir todas as ocorrências dedog com cat usando a seguinte expressão regular -
#/user/bin/perl
$string = "The cat sat on the mat";
$string =~ s/cat/dog/;
print "$string\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
The dog sat on the mat
Modificadores de operador de substituição
Aqui está a lista de todos os modificadores usados com o operador de substituição.
Sr. Não. | Modificador e descrição |
---|---|
1 | i Torna a correspondência insensível a maiúsculas e minúsculas. |
2 | m Especifica que se a string tiver caracteres de nova linha ou de retorno de carro, os operadores ^ e $ agora corresponderão a um limite de nova linha, em vez de um limite de string. |
3 | o Avalia a expressão apenas uma vez. |
4 | s Permite o uso de. para corresponder a um caractere de nova linha. |
5 | x Permite que você use espaços em branco na expressão para maior clareza. |
6 | g Substitui todas as ocorrências da expressão encontrada pelo texto de substituição. |
7 | e Avalia a substituição como se fosse uma instrução Perl e usa seu valor de retorno como o texto de substituição. |
O operador de tradução
A tradução é semelhante, mas não idêntica, aos princípios da substituição, mas ao contrário da substituição, a tradução (ou transliteração) não usa expressões regulares para sua pesquisa em valores de substituição. Os operadores de tradução são -
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
A tradução substitui todas as ocorrências dos caracteres em SEARCHLIST pelos caracteres correspondentes em REPLACEMENTLIST. Por exemplo, usando o "O gato sentou no tapete". string que temos usado neste capítulo -
#/user/bin/perl
$string = 'The cat sat on the mat';
$string =~ tr/a/o/;
print "$string\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
The cot sot on the mot.
Os intervalos de Perl padrão também podem ser usados, permitindo que você especifique intervalos de caracteres por letra ou valor numérico. Para alterar o caso da string, você pode usar a seguinte sintaxe no lugar douc função.
$string =~ tr/a-z/A-Z/;
Modificadores de operador de tradução
A seguir está a lista de operadores relacionados à tradução.
Sr. Não. | Modificador e descrição |
---|---|
1 | c Complementa SEARCHLIST. |
2 | d Exclui caracteres encontrados, mas não substituídos. |
3 | s Squashes duplicam caracteres substituídos. |
O modificador / d exclui os caracteres correspondentes a SEARCHLIST que não possuem uma entrada correspondente em REPLACEMENTLIST. Por exemplo -
#!/usr/bin/perl
$string = 'the cat sat on the mat.';
$string =~ tr/a-z/b/d;
print "$string\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
b b b.
O último modificador, / s, remove as sequências duplicadas de caracteres que foram substituídos, portanto -
#!/usr/bin/perl
$string = 'food';
$string = 'food';
$string =~ tr/a-z/a-z/s;
print "$string\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
fod
Expressões regulares mais complexas
Você não precisa apenas combinar em strings fixas. Na verdade, você pode corresponder a praticamente qualquer coisa com que poderia sonhar, usando expressões regulares mais complexas. Aqui está uma ficha rápida -
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 | * Corresponde a 0 ou mais ocorrências da expressão anterior. |
7 | + Corresponde a 1 ou mais ocorrências da expressão anterior. |
8 | ? Corresponde a 0 ou 1 ocorrência da expressão anterior. |
9 | { n} Corresponde exatamente ao número n de ocorrências da expressão anterior. |
10 | { n,} Corresponde a n ou mais ocorrências da expressão anterior. |
11 | { 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 | \w Corresponde a caracteres de palavras. |
14 | \W Corresponde a caracteres que não sejam palavras. |
15 | \s Corresponde ao espaço em branco. Equivalente a [\ t \ n \ r \ f]. |
16 | \S Corresponde a espaços não brancos. |
17 | \d Corresponde aos dígitos. Equivalente a [0-9]. |
18 | \D Corresponde a nondigits. |
19 | \A Corresponde ao início da string. |
20 | \Z Corresponde ao final da string. Se houver uma nova linha, ela corresponderá imediatamente antes da nova linha. |
21 | \z Corresponde ao final da string. |
22 | \G As partidas apontam onde a última partida terminou. |
23 | \b Corresponde aos limites da palavra quando fora dos colchetes. Corresponde ao backspace (0x08) quando entre colchetes. |
24 | \B Corresponde a limites sem palavras. |
25 | \n, \t, etc. Corresponde a novas linhas, retornos de carro, guias, etc. |
26 | \1...\9 Corresponde à enésima subexpressão agrupada. |
27 | \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. |
28 | [aeiou] Corresponde a um único caractere no conjunto fornecido |
29 | [^aeiou] Corresponde a um único caractere fora do conjunto fornecido |
O ^ metacaractere corresponde ao início da string e o $ metasymbol corresponde ao final da string. Aqui estão alguns exemplos breves.
# nothing in the string (start and end are adjacent)
/^$/
# a three digits, each followed by a whitespace
# character (eg "3 4 5 ")
/(\d\s) {3}/
# matches a string in which every
# odd-numbered letter is a (eg "abacadaf")
/(a.)+/
# string starts with one or more digits
/^\d+/
# string that ends with one or more digits
/\d+$/
Vamos dar uma olhada em outro exemplo.
#!/usr/bin/perl
$string = "Cats go Catatonic\nWhen given Catnip";
($start) = ($string =~ /\A(.*?) /);
@lines = $string =~ /^(.*?) /gm;
print "First word: $start\n","Line starts: @lines\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
First word: Cats
Line starts: Cats When
Limites correspondentes
o \bcorresponde a qualquer limite de palavra, conforme definido pela diferença entre a classe \ w e a classe \ W. Como \ w inclui os caracteres de uma palavra e \ W o oposto, isso normalmente significa o término de uma palavra. o\Bassertion corresponde a qualquer posição que não seja um limite de palavra. Por exemplo -
/\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat'
/\Bcat\B/ # Matches 'verification' but not 'the cat on the mat'
/\bcat\B/ # Matches 'catatonic' but not 'polecat'
/\Bcat\b/ # Matches 'polecat' but not 'catatonic'
Selecionando Alternativas
O | caractere é como o padrão ou bit a bit OR em Perl. Ele especifica correspondências alternativas dentro de uma expressão regular ou grupo. Por exemplo, para corresponder a "gato" ou "cachorro" em uma expressão, você pode usar isto -
if ($string =~ /cat|dog/)
Você pode agrupar elementos individuais de uma expressão para oferecer suporte a correspondências complexas. Pesquisar o nome de duas pessoas pode ser feito com dois testes separados, como este -
if (($string =~ /Martin Brown/) || ($string =~ /Sharon Brown/))
This could be written as follows
if ($string =~ /(Martin|Sharon) Brown/)
Combinação de agrupamento
Do ponto de vista da expressão regular, não há diferença entre, exceto, talvez, que o primeiro seja ligeiramente mais claro.
$string =~ /(\S+)\s+(\S+)/;
and
$string =~ /\S+\s+\S+/;
No entanto, o benefício do agrupamento é que ele nos permite extrair uma sequência de uma expressão regular. Os agrupamentos são retornados como uma lista na ordem em que aparecem no original. Por exemplo, no fragmento a seguir, retiramos as horas, minutos e segundos de uma string.
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
Além desse método direto, os grupos correspondentes também estão disponíveis nas variáveis especiais $ x, onde x é o número do grupo na expressão regular. Podemos, portanto, reescrever o exemplo anterior da seguinte forma -
#!/usr/bin/perl
$time = "12:05:30";
$time =~ m/(\d+):(\d+):(\d+)/;
my ($hours, $minutes, $seconds) = ($1, $2, $3);
print "Hours : $hours, Minutes: $minutes, Second: $seconds\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
Hours : 12, Minutes: 05, Second: 30
Quando grupos são usados em expressões de substituição, a sintaxe $ x pode ser usada no texto de substituição. Assim, poderíamos reformatar uma string de data usando este -
#!/usr/bin/perl
$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;
print "$date\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
1999/03/26
The \ G Assertion
A asserção \ G permite que você continue pesquisando a partir do ponto onde ocorreu a última correspondência. Por exemplo, no código a seguir, usamos \ G para que possamos pesquisar a posição correta e, em seguida, extrair algumas informações, sem ter que criar uma expressão regular única mais complexa -
#!/usr/bin/perl
$string = "The time is: 12:31:02 on 4/12/00";
$string =~ /:\s+/g;
($time) = ($string =~ /\G(\d+:\d+:\d+)/);
$string =~ /.+\s+/g;
($date) = ($string =~ m{\G(\d+/\d+/\d+)});
print "Time: $time, Date: $date\n";
Quando o programa acima é executado, ele produz o seguinte resultado -
Time: 12:31:02, Date: 4/12/00
A asserção \ G é na verdade apenas o meta-símbolo equivalente da função pos, portanto, entre as chamadas de expressões regulares, você pode continuar a usar pos e até mesmo modificar o valor de pos (e, portanto, \ G) usando pos como uma sub-rotina de lvalue.
Exemplos de expressões regulares
Caracteres literais
Sr. Não. | Exemplo e descrição |
---|---|
1 | Perl Combine "Perl". |
Classes de personagens
Sr. Não. | 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 anteriores |
8 | [^aeiou] Corresponde a qualquer coisa que não seja uma vogal minúscula |
9 | [^0-9] Corresponde a qualquer coisa diferente de 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 Corresponde 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? Corresponde a "rub" ou "ruby": o y é opcional |
2 | ruby* Corresponde a "rub" 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 a 3 ou mais dígitos |
6 | \d{3,5} Corresponde a 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 Corresponde a python & pails ou Python & 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
Esta necessidade de especificar posições 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 |