2016-08-02 2 views
0

У меня есть строка, как этотRegex, чтобы извлечь все адреса из строки

http://example.com/path/topage.htmlhttp://twitter.com/p/xyanhshttp://httpget.org/get.zipwww.google.com/privacy.htmlhttps://goodurl.net/

Я хотел бы, чтобы извлечь все URL/webaddress в массив. например

urls = ['http://example.com/path/topage.html','http://twitter.com/p/xyan',.....]

Вот мой подход, который не работал.

import re 
strings = "http://example.com/path/topage.htmlhttp://twitter.com/p/xyanhshttp://httpget.org/get.zipwww.google.com/privacy.htmlhttps://goodurl.net/" 
links = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', strings) 

print links 
// result always same as strings 
+2

Это должно полезно вам: http://regex101.com. Вы можете поиграть с вашим регулярным выражением, чтобы посмотреть, что может быть с вашей проблемой. – idjaw

+0

Вам нужно вести ведущие «http (s)»? – Bahrom

+0

Да, мне придется @Bahrom –

ответ

2

Проблема в том, что ваш шаблон регулярного выражения является слишком инклюзивным. Он включает в себя все URL-адреса. Вы можете использовать предпросмотр с помощью

Попробуйте это (=?):

re.findall("((www\.|http://|https://)(www\.)*.*?(?=(www\.|http://|https://|$)))", strings) 
+0

Не записывает 'www.google.com/privacy.html', в противном случае это нормально –

+0

Хорошая точка. Работаю над этим. – Munchhausen

+0

привет @Muchhausen, спасибо, что он почти работает, кроме 'http: // httpget.org/get.zipwww.google.com/privacy.html' этого URL-адреса. –

0

Ваша проблема заключается в том, что http:// в настоящее время принимается в качестве действительной части URL. Это происходит из-за этого маркера здесь:

[[email protected]&+] 

или более конкретно:

$-_ 

Это соответствует всем символам с диапазоном от $ до _, который включает в себя намного больше символов, чем вы, вероятно, предназначены для делать.

Вы можете изменить это на [$\[email protected]&+], но это вызывает проблемы, так как теперь цифры / не совпадают. Поэтому добавьте его, используя [$\[email protected]&+/]. Однако это снова вызовет проблемы, так как http://example.com/path/topage.htmlhttp будет считаться допустимым.

Окончательное дополнение должно добавить lookahead, чтобы убедиться, что вы не согласны с http:// или https://, что именно так случается, чтобы быть первой частью вашего регулярного выражения!

http[s]?://(?:(?!http[s]?://)[a-zA-Z]|[0-9]|[$\[email protected]&+/]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+ 

испытания here

0

Простой ответ, не вдаваясь в особых осложнений:

import re 
url_list = [] 

for x in re.split("http://", l): 
    url_list.append(re.split("https://",x)) 

url_list = [item for sublist in url_list for item in sublist] 

В случае, если вы хотите добавить строку http:// и https:// обратно к адресам, сделайте соответствующие изменения в код. Надеюсь, я передаю эту идею.

+0

Не все URL имеют 'http: //' в них –

0

здесь мое

(r’http[s]?://[a-zA-Z]{3}\.[a-zA-Z0-9]+\.[a-zA-Z]+') 
+0

Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, было бы [значительно улучшено, если бы оно включало объяснение] (// meta.stackexchange.com/q/114762) * как * он решает вопрос. Без этого ваш ответ имеет гораздо меньшую образовательную ценность - помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

Смежные вопросы