Expresión regular de la URL de Gruber en Python

¿Cómo reescribo esta nueva forma de reconocer las direcciones para trabajar en Python?

\b(([\w-]+://?|www[.])[^\s()]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

La fuente original para los estados “Este patrón debería funcionar en la mayoría de las implementaciones de expresiones regulares modernas” y específicamente en Perl. La implementación de expresiones regulares de Python es moderna y similar a la de Perl, pero le falta la clase de caracteres [:punct:] . Puedes construirlo fácilmente usando esto:

 >>> import string, re >>> pat = r'\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^%s\s]|/)))' >>> pat = pat % re.sub(r'([-\\\]])', r'\\\1', string.punctuation) 

La llamada re.sub() escapa de ciertos caracteres dentro del conjunto de caracteres según sea necesario .

Edición : el uso de re.escape () funciona igual de bien, ya que solo pega una barra invertida delante de todo . Al principio eso me pareció crudo, pero ciertamente funciona bien para este caso.

 >>> pat = pat % re.escape(string.punctuation) 

No creo que Python tenga esta expresión.

 [:punct:] 

Wikipedia dice [:punct:] es lo mismo que

 [-!\"#$%&\'()*+,./:;<=>?@\\[\\\\]^_`{|}~] 

Python no tiene las expresiones de corchete POSIX .

La expresión de corchete [:punct:] es equivalente en ASCII a

 [!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]