Найдите URL-адреса в тексте и замените их доменным именем - PullRequest
0 голосов
/ 28 мая 2018

Я работаю над проектом НЛП и хочу заменить все URL-адреса в тексте на их доменное имя, чтобы упростить мою корпорацию.

Примером этого может быть:

Input: Ask questions here https://stackoverflow.com/questions/ask
Output: Ask questions here stackoverflow.com

В данный момент я нахожу URL-адреса со следующим RE:

urls = re.findall('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', text)

И затем я перебираю ихчтобы получить доменное имя:

doms = [re.findall(r'^(?:https?:)?(?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)',url) for url in urls]

А затем я просто заменяю каждый URL-адрес его домом.

Это не оптимальный подход, и мне интересно, есть ли у кого-то лучшее решение для этогопроблема!

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы также можете сопоставить шаблон http\S+, который начинается с http, а затем не совпадает с пробелом, чтобы соответствовать URL.Разберите URL и верните часть имени хоста:

import re
from urllib.parse import urlparse

subject = "Ask questions here https://stackoverflow.com/questions/ask and here https://stackoverflow.com/questions/"
print(re.sub("http\S+", lambda match: urlparse(match.group()).hostname, subject))

Demo Python 3

Demo Python 2

Редактировать : если строка может начинаться с http или www, вы можете использовать (?:http|www\.)\S+:

def checkLink(str):
    str = str.group(0)
    if not str.startswith('http'):
        str = '//' + str
    return urlparse(str).hostname
print(re.sub("(?:http|www\.)\S+", checkLink, subject))

Демо

0 голосов
/ 28 мая 2018

Вы можете использовать re.sub:

import re
s = 'Ask questions here https://stackoverflow.com/questions/ask, new stuff here https://stackoverflow.com/questions/, Final ask /11547324/naidite-url-adresa-v-tekste-i-zamenite-ih-domennym-imenem mail server here mail.inbox.com/whatever'
new_s = re.sub('https*://[\w\.]+\.com[\w/\-]+|https*://[\w\.]+\.com|[\w\.]+\.com/[\w/\-]+', lambda x:re.findall('(?<=\://)[\w\.]+\.com|[\w\.]+\.com', x.group())[0], s)

Выход:

'Ask questions here stackoverflow.com, new stuff here stackoverflow.com, Final ask stackoverflow.com mail server here mail.inbox.com'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...