Regex de URL que detecta enlaces que continúan en la segunda línea.
Estoy utilizando Python para extraer enlaces de archivos PDF. Tengo una expresión regular que funciona en su mayor parte.
URL_REGEX = r"""(?i)\b
(?i)\b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?:com|net|org|edu|
(?:gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|
[a-z][\w-]+://
travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|
(?:\S+(?::\S*)?@)?
be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|
(?:cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|
(?:fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|
[1-9]\d?|1\d\d|2[01]\d|22[0-3]
hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|
|25[0-5]|[1-9]\d|\d
kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|
)\.(?:mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|
[1-9]\d?|1\d\d|2[0-4]\d|25[0-5]
nz|om|pa|pe|pf|pg|ph|
|[1-9]\d|\d
pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|
)\.(?:sl|sm|sn|so|sr|ss|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|
[1-9]\d?|1\d\d|2[0-4]\d|25[0-5]
tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vn|vu|wf|ws|ye|yt|za|zm|zw)/
|[1-9]\d|\d
[^\s()<>{}\[\]]+[^\s`!()\[\]{};:'",.<>?“”‘’]))"""
Pero si una URL continúa en la siguiente línea, se cortará. Como resultado, escribí este pequeño cambio con la esperanza de resolver el problema, pero ahora tengo más falsos negativos, donde agrega la primera palabra de la línea siguiente, incluso si no forma parte de la URL.
def extract_urls(text):
"""
Esta función devuelve todas las URL únicas encontradas en el argumento `text`.
- Primero utilizamos la expresión regular para encontrar todas las coincidencias de URLs.
- Finalmente convertimos la lista en un conjunto, para obtener solo URLs únicas (sin duplicados).
"""
text = text.replace("\n", "")
return set(re.findall(URL_REGEX, text, re.IGNORECASE))
Cualquier ayuda sería apreciada.
davy.ai
Parece que el problema con la interrupción de las URL que continúan en la siguiente línea está relacionado con la eliminación del carácter de nueva línea en el paso
text.replace("\n", '')
. En lugar de eliminar el carácter de nueva línea, puedes intentar reemplazarlo por un espacio (' '
) para asegurarte de que las URL continúen en varias líneas. Aquí tienes una versión modificada de la funciónextract_urls
:Esto permitirá que las URLs continúen en la siguiente línea sin ser interrumpidas. ¡Avísame si tienes alguna otra pregunta!