• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zero-cool

Procurar em multiplas linhas

13 mensagens neste tópico

Boas,

Estou a tentar o seguinte código:

import re
import string

ss = """
Linha 1
Linha 2
Linha 3
http://www.blablabla.com
Linha 5
Linha 6
http://www.blublublu.com
Linha 7
Linha 8
    """
resultado = re.search('^http([^\n\r]+).*$',ss)
print resultado
print resultado.groups()

Não consigo fazer com que esta procura seja feita nestas multi-linhas. Alguém sabe porquê? Não deveria a quebra de linha ser interpretada por \r\n?

Abraços,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

^ = inicio da string; $ = final da string.

por isso:

re.search('\\r\\nhttp([^\n\r]+).*\\r\\n', ss)

por exemplo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

^ = inicio da string; $ = final da string.

por isso:

re.search('\\r\\nhttp([^\n\r]+).*\\r\\n', ss)

por exemplo.

Obrigado pela resposta. Acho que não percebeste o problema. O \r\n foi apenas exemplo. Se usar algo como

resultado = re.search('.http(.*).*$',ss)

também não funciona. Retorna-me sempre None.

Abraço,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E que tal tirares o $?

re.search('.*(http.+).*', ss)

Funciona, mas não localiza todos os resultados:

#shell
('http://www.blablabla.com',)

Abraços,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E que tal tirares o $?

re.search('.*(http.+).*', ss)

Funciona, mas não localiza todos os resultados:

#shell
('http://www.blablabla.com',)

Abraços,

Experimenta com '.*?(http([^\n\r]+).*?'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta com '.*?(http([^\n\r]+).*?'

Assim dá erro. Talvez quisesses dizer isto: '.*?(http[^\n\r]+).*?' retorna novamente o primeiro link apenas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta com '.*?(http([^\n\r]+).*?'

Assim dá erro. Talvez quisesses dizer isto: '.*?(http[^\n\r]+).*?' retorna novamente o primeiro link apenas.

Hmm... '(.*?(http[^\n\r]+))*.*'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Começo a acreditar que o problema está mesmo no re.search não ser capaz de ler multi-linhas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Começo a acreditar que o problema está mesmo no re.search não ser capaz de ler multi-linhas...

Não tem a ver com o número de linhas, mas com a própria função search, que só mostra a primeira ocorrência a ser encontrada (search() will scan forward through the string, reporting the first match it finds). Por isso é que o Threshold sugeriu a função re.findall. Mais info no link que o Threshold deixou acima.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não tem a ver com o número de linhas, mas com a própria função search, que só mostra a primeira ocorrência a ser encontrada (search() will scan forward through the string, reporting the first match it finds). Por isso é que o Threshold sugeriu a função re.findall. Mais info no link que o Threshold deixou acima.

Não tinha visto essa, mas resultou lindamente. :( Muito obrigado.

re.findall('.*(http.+).*', ss)

Abraços,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora