#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. Здравствуйте, я попытался заменить
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