es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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ón extract_urls:

    def extract_urls(text):
        """
        Esta función devolverá todas las URL únicas encontradas en el argumento `text`.
        - Primero usamos regex para encontrar todas las coincidencias de URL.
        - Finalmente convertimos la lista en un conjunto, para asegurarnos de tener 
          URL únicas (sin duplicados).
        """
        text = text.replace('\n', ' ') # reemplazar las nuevas líneas por espacios
        return set(re.findall(URL_REGEX, text, re.IGNORECASE))
    

    Esto permitirá que las URLs continúen en la siguiente línea sin ser interrumpidas. ¡Avísame si tienes alguna otra pregunta!

Comments are closed.