Expressão regular de URL de Gruber em Python
Pergunta
Como faço para reescrever isso nova maneira de reconhecer endereços para trabalhar em Python?
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
Solução
o fonte original Para isso, os estados "esse padrão deve funcionar na maioria das implementações modernas do Regex" e especificamente Perl. A implementação de Regex de Python é moderna e semelhante ao de Perl mas está faltando o [:punct:]
classe de personagem. Você pode construir facilmente isso usando isso:
>>> import string, re
>>> pat = r'\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^%s\s]|/)))'
>>> pat = pat % re.sub(r'([-\\\]])', r'\\\1', string.punctuation)
o re.sub()
Call escapa a certos personagens dentro do conjunto de personagens como requerido.
Editar: Usar re.escape () também funciona, pois apenas enfia uma barra de barriga na frente tudo. Isso me pareceu grosseiro para mim, mas certamente funciona bem para este caso.
>>> pat = pat % re.escape(string.punctuation)
Outras dicas
Eu não acho que Python tenha essa expressão
[:punct:]
Wikipedia diz [:punct:]
é o mesmo para
[-!\"#$%&\'()*+,./:;<=>?@\\[\\\\]^_`{|}~]
Python não tem o Expressões de suporte POSIX.
o [:punct:]
A expressão do suporte é equivalente em ASCII a
[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]