2009-12-31 23 views
5

¿Cómo reescribo las direcciones new way to recognise para trabajar en Python?Expresión regular URL de Gruber en Python

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

+0

¿Qué parte no funciona? –

+0

¿Por qué no pones tu código en la pregunta? Con ejemplos de lo que falla –

+0

@vanity, la respuesta con propiedades de caracteres Unicode no funcionará. Ver http://stackoverflow.com/questions/1832893/python-regex-matching-unicode-properties –

Respuesta

12

El original source para que los Estados "Este patrón debería funcionar en la mayoría de las implementaciones de expresiones regulares modernos" y específicamente Perl. La implementación de expresiones regulares de Python es moderna y similar to Perl's pero falta la clase de caracteres [:punct:]. Usted puede construir fácilmente que el uso de este:

>>> 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 a ciertos personajes dentro del juego de caracteres as required.

Editar: Usando re.escape() funciona igual de bien, ya que simplemente se pega una barra invertida delante de todo . Eso me pareció grosero al principio, pero ciertamente funciona bien para este caso.

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

Esto pasa todas las pruebas de Gruber, al igual que pat = pat% re.escape (string.punctuation) – Tobias

+0

@vanity, actualizado para mencionarlo. Tenga en cuenta lo obvio, que si su fuente de datos es Unicode, una solución pura ASCII como string.punctuation puede dar resultados imperfectos. –

+0

Funciona con dominios y rutas que no son ASCII. No tengo datos de prueba con puntuación que no sea en inglés. – Tobias

5

No creo pitón tienen esta expresión

[:punct:] 

Wikipedia dice [:punct:] es igual a

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

Wikipedia está equivocada. Le falta el cursor, según http://www.regular-expressions.info/posixbrackets.html. –

+0

Bien, ahora está bien. Por favor actualiza tu respuesta. –

+0

Sí, actualicé mi publicación, gracias. Alguien actualizó Wikipedia también. ¡Estupendo! – YOU

2

Python no tiene la POSIX bracket expressions.

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

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

Asegúrate de usar una cadena "cruda" (prefijo con 'r') cuando lo uses, ya que de lo contrario la escara se escapa. –

+0

También tenga en cuenta que Python no admite esas propiedades de caracteres Unicode: http://stackoverflow.com/questions/1832893 –

+0

De hecho, compilan bien pero no hacen lo que espera – Tobias

Cuestiones relacionadas