Expressões regulares III

Procurar URLs no meio do texto, em particular ligações http ou https, com expressões regulares, considerando nomes em Unicode, nomeadamente nomes de ficheiros, de domínios e de domínios de topo (TLD, top level domains). Além disso, os nomes dos TLD, que antes eram limitados a um lote pequeno e conhecido, agora nascem todas as semanas, e com tamanhos variáveis. Aparentemente, há um limite para esse tamanho, mas até quando?

Neste momento, o limite está definido nas RFC 1035, RFC 1123, e RFC 2181. Esse limite é de 63 carateres para cada segmento do nome de domínio, e 253 para o nome na totalidade, considerando já a representação textual – Punycode – no caso dos nomes que usem letras para além do ASCII ou, mais precisamente, para além do conjunto LDH (letras, dígitos, hífen), a-z, A-Z, 0-9 e o hífen.

Os URLs contêm também nomes de diretorias e de ficheiros, assim como parâmetros e variáveis para páginas dinâmicas. Construir um interpretador de URLs não é tarefa fácil. É preferível usar um já criado e testado e, eventualmente, melhorá-lo ou corrigi-lo.

Foi isso que eu fiz, e aqui fica o programa exemplo em Python com a expressão regular para caçar URLs:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import re

line = "#lol avião https://gist.github.com/HenkPoley/8899766 com o tóino a bordo test@google.co.il, person@amazon.co.uk https://www.vinicius.atongadamirongadokabuletê/fotos/pauta.gif e outro http://www.pagina.移动/index.php e mais um outro link: https:///w3.游戏/ http://w3.pt e ainda https://stat.cool/index.php "

p = re.compile(r"""(?i)\b((?:https?:(?:/{1,3}|[\w0-9%])|[\w0-9.\-]+[.](?:\w{2,63})/)(?:[^\s()<>{}\[\]]+|\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\))+(?:\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:\b(?<![@.])[\w0-9]+(?:[.\-][\w0-9]+)*[.](?:\w{2,63})\b/?(?!@)))""", re.U)

r = p.findall(line)
print r

O resultado da interpretação é o seguinte:

['https://gist.github.com/HenkPoley/8899766', 'https://www.vinicius.atongadamirongadokabulet\xc3\xaa/fotos/pauta.gif', 'http://www.pagina.\xe7\xa7\xbb\xe5\x8a\xa8/index.php', 'https:///w3.\xe6\xb8\xb8\xe6\x88\x8f/', 'http://w3.pt', 'https://stat.cool/index.php']

Links usados para obter este resultado, por ordem cronológica:
Python regular expression again – match url
An Improved Liberal, Accurate Regex Pattern for Matching URLs
gruber/Liberal Regex Pattern for Web URLs
winzig/Liberal Regex Pattern for URLs
Domain Name System

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *