Самый быстрый способ получить URL-адрес внутри строки

#python #regex #findall

#python #регулярное выражение #найдите все

Вопрос:

Я должен проверить тысячи строк, мне нужно получить полный URL, который содержит instagram.com/p/

Пока я использую этот метод:

 msg ='hello there http://instagram.com/p/BvluRHRhN16/'
msg = re.findall(
            'http[s]?://?[w/-?=%.] instagram.com/p/(?:[a-zA-Z]|[0-9]|[$-_@.amp; ]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F])) ',
            msg)
print(msg)
  

но есть определенные URL-адреса, которые он не может найти.

Я хочу получить все URL-адреса, подобные следующим:

https://instagram.com/p/BvluRHRhN16/
https://www.instagram.com/p/BvluRHRhN16/
http://instagram.com/p/BvluRHRhN16/
https://www.instagram.com/p/BvluRHRhN16/
www.instagram.com/p/BvluRHRhN16/

Как я могу получить этот результат максимально быстрым способом?

Комментарии:

1. почему бы просто не записать все после http, а затем передать этот результат в urlparser в stdlib, чтобы убедиться, что это допустимый URL

Ответ №1:

 url = '''
'hello there http://google.com/p/BvluRHRhN16/ this is a test',
      'hello there https://www.instagram.com/p/BvluRHRhN16/',
      'hello there www.instagram.com/p/BvluRHRhN16/ this is a test',
      'hello there https://www.instagram.net/p/BvluRHRhN16/ this is a test'
'''

from urlextract import URLExtract

extractor = URLExtract()
urls = extractor.find_urls(url)
print(urls)
  

Вывод :
[‘http://google.com/p/BvluRHRhN16 /‘, ‘https://www.instagram.com/p/BvluRHRhN16 /‘, ‘www.instagram.com/p/BvluRHRhN16 /’, ‘https://www.instagram.net/p/BvluRHRhN16 /‘]

Отредактировано: отфильтруйте URL-адрес

 filtered = ([item for item in urls if "instagram.com/p/" in item])

print(filtered)
  

Вывод :
[‘https://www.instagram.com/p/BvluRHRhN16 /‘, ‘www.instagram.com/p/BvluRHRhN16 /’]

Комментарии:

1. Он не пытается извлечь все URL-адреса. Только определенный URL в качестве его намерения.

2. Отредактировал приведенный выше ответ, чтобы отфильтровать требуемый контекстный путь.

Ответ №2:

Я предполагаю, что входные данные представляют собой список предложений, содержащих URL. Надеюсь, это может помочь.

 msg =['hello there http://google.com/p/BvluRHRhN16/ this is a test',
      'hello there https://www.instagram.com/p/BvluRHRhN16/',
      'hello there www.instagram.com/p/BvluRHRhN16/ this is a test',
      'hello there https://www.instagram.net/p/BvluRHRhN16/ this is a test'
     ]

for m in msg:
    ms = re.findall('(http.*instagram. /p. |www.*instagram. /p. )',m)
    print(ms)
  

Отредактированное регулярное выражение:

 ms = re.findall('(http.*instagram.com/p. /|www.*instagram.com/p. /)',m)
  

Комментарии:

1. Это также вернет весь текст после URL-адреса. Например, «привет www.instagram.com/p/BvluRHRhN16 / это тест «возвращает»:www.instagram.com/p/BvluRHRhN16 / это тест»

2. Здравствуйте, я попытался заменить instagram на google , и он также печатает ссылку Google, чего не должно быть.. Есть другой способ?

3. @Yusufsn Это работает довольно хорошо, но проблема, с которой я сталкиваюсь с вашим решением, заключается в следующем: если после ссылки есть пробел, а затем слово, оно также печатает слово, например, если жало https://www.instagram.com/p/BvnyDjXnHl5/ hello there , оно печатает ссылку плюс привет

4. Я попробовал на своей машине, это работает так же, как и ваше намерение. Посмотрите и измените регулярное выражение на отредактированную версию. Если входные данные https://www.instagram.com/p/BvnyDjXnHl5/ hello there , то выходные данные будут https://www.instagram.com/p/BvnyDjXnHl5/

5. @Yusufsn Я пробовал на своем компьютере и даже в Интернете, но я получаю hello there после ссылки, попробуйте зайти и проверить онлайн на repl.it/repls/BoringFlakyInfinity