正则表达式从字符串中提取所有URL

时间:2016-08-02 21:29:31

标签: python 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]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', strings)

print links
// result always same as strings 

4 个答案:

答案 0 :(得分:2)

问题在于你的正则表达式模式太具包容性了。它包括所有网址。您可以使用(?=)

来使用前瞻

试试这个:

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

答案 1 :(得分:1)

您的问题是http://被接受为网址的有效部分。这是因为这个标记就在这里:

[$-_@.&+]

或更具体地说:

$-_

这会匹配范围从$_的所有字符,其中包含的字符比您可能要做的要多得多。

您可以将其更改为[$\-_@.&+]但这会导致问题,因为现在/字符将不匹配。所以使用[$\-_@.&+/]添加它。但是,这会再次导致问题,因为http://example.com/path/topage.htmlhttp将被视为有效匹配。

最后添加的是添加一个预测,以确保您不匹配http://https://,这恰好是正则表达式的第一部分!

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

测试here

答案 2 :(得分: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://追加回网址,请对代码进行适当的更改。希望我传达这个想法。

答案 3 :(得分:0)

这里是我的

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