Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Expressões regulares

não entendi por que o código

resultados = re.findall(r'(^\d\w+)', '88centavos Peer2Peer Python2 99taxi')

retorna '88centavos' e por que o código

resultados = re.findall(r'(\b\d\w+)', '88centavos Peer2Peer Python2 99taxi')

retorna '88centavos, '99taxi'

6 respostas

Boa noite, Priscila!

O ^\d\w+ diz que iniciará com um número, podendo ter uma ou mais palavras após esse número. Perceba que ele só traz a primeira ocorrência da palavra, justamente por causa do ^.

O \b\d\w+ diz quase que a mesma coisa da expressão anterior, entretanto, ele vai pegar quantas expressões existirem que satisfaçam o \d\w+ (ou seja, que iniciem com número e tenha uma ou mais letras). Assim, 88centavos e 99taxi satisfazem essa condição.

Se colocássemos a lista 33cachorro, 77gato, peixe22, pato44, teríamos como resultado 33cachorro e 77gato, pois são as únicas que começam com número e possuem uma ou mais letras após esse número.

Espero ter ajudado.

Abraço.

Obrigado, Manoel, mas ainda não entendi. :/ Na minha leitura '88centavos' e '99taxi' correspondem a regex (^\d\w+). Ainda não consegui compreender. Pode explicar de outra forma, por favor?

solução!

Priscila, vamos lá... :)

Imagina que temos a seguinte expressão a ser avaliada:

99galinha peixe33boi cachorro 77gato c55elho pato44 888 22cobra

O símbolo ^ indica que a expressão buscada deve começar com (é obrigatório começar com o que vem a seguir).

A expressão \d significa que deve ser um dígito.

Até aqui, temos:

^\d

Isso significa que, até aqui, a expressão que buscamos deve começar com um dígito (deve começar com um número qualquer).

A expressão \w+ significa que o que vem a seguir pode ser uma ou mais letras.

Então, temos que:

(^\d\w+)
^ deve começar com
\d um dígito (número)
\w+ podendo ter uma ou mais letras depois do dígito

Assim, aplicando na nossa lista, teremos como resultado:

['99galinha']

Pois nossa expressão de avaliação começa com número (^\d). Perceba que 77gato 888 e 22cobra não entram como resposta. Por quê? Porque a expressão para avaliação é toda a sequência de caracteres.

99galinha peixe33boi cachorro 77gato c55elho pato44 888 22cobra

O primeiro caractere dessa string é 9 (de 99galinha) e o último é a (de 22cobra).

Quanto ao segundo exemplo, perceba que não temos mais o caractere ^. Isso significa que a expressão de avaliação não precisa começar com. O \b diz que deve ser retornado todo trecho da expressão que satisfaz o restante da regex, nesse caso o \d\w+. Assim, onde houver, dentro da expressão de avaliação, palavras que satisfaçam o \d\w+, ou seja,um número seguido de uma ou mais caracteres serão exibidos. Podemos ler a regex \b\d\w+ como: traga todos os trechos (\b) que comecem com um número (\d) e possuam após esse número um ou mais caracteres (\w+).

Assim, como resultado da expressão , teremos:

>>> import re
>>> resultados = re.findall(r'(\b\d\w+)', '99galinha peixe cachorro 77gato c55elho pato44 888 22cobra')
>>> resultado
['99galinha', '77gato', '888', '22cobra']

Vê se ficou melhor de entender assim, Priscila. :)

Muito bem explicado Manoel.

Acredito que esta dúvida da Priscila ocorra principalmente porque esquecemos que a expressão busca uma STRING inteira. Ou seja, um texto completo com várias palavras, não uma lista separada de itens.

Os exemplos mostrados nesta aula ajudam a causar esta falsa impressão porque sugerem ser uma lista encadeada e pontual (88centavos, Python2, etc.), mas na verdade, são um emaranhado de palavras, como um texto normal.

A notação "^" força o programa a busca somente a PRIMEIRA ocorrência dentro do texto inteiro, enquanto a "\b" vai trazer TODAS as ocorrências que satisfazem a regra.

Abraços

Valeu, Thiago!

Regex é chatinho mesmo de entender, vez em quando também me perco... hehe

Abraço

Eu já tinha entendido, mas agora entendo muito mais, obrigado Manoel e Thiago!!!!