使用re.findall获取链接

时间:2015-02-14 12:54:40

标签: python

我试图获取文件中给出的所有链接。所有链接都包含在""还有http,https和ftp链接。下面是该文件的示例输出。

$ cat file 

"http://www.google.com" and "http://www.yahoo.com" and "http://www.facebook.com"
"https://1.1.1.1" and "ftp://a.a.a.a"

下面是我的python代码

In [109]: FILE = open('file','r')

In [110]: data = FILE.read()

In [111]: links = re.findall('"((http|ftp)s?://.*?)"', data)

In [112]: print links

    [('http://www.google.com', 'http'), ('http://www.yahoo.com', 'http'), ('http://www.facebook.com', 'http'), ('https://1.1.1.1', 'http'), ('ftp://a.a.a.a', 'ftp')]

为什么输出包含' http'原始链接后。我哪里做错了? 有人可以请帮助。我在Python 2.7.6中使用(IPython 2.3.1)

2 个答案:

答案 0 :(得分:2)

因为你的正则表达式包含两个捕获组。第一个捕获组捕获整个链接,而另一个捕获组仅捕获httpftp部分。我建议你将第二个捕获组转为非捕获组,因为re.findall函数给出了捕获组的第一个偏好。如果在正则表达式中找不到捕获组,则只返回匹配。

re.findall(r'"((?:http|ftp)s?://.*?)"', data)

示例:

>>> s = '''"http://www.google.com" and "http://www.yahoo.com" and "http://www.facebook.com"
"https://1.1.1.1" and "ftp://a.a.a.a"'''
>>> re.findall(r'"((?:http|ftp)s?://.*?)"', s)
['http://www.google.com', 'http://www.yahoo.com', 'http://www.facebook.com', 'https://1.1.1.1', 'ftp://a.a.a.a']

答案 1 :(得分:0)

如果您的所有文件都是这样,您可以拆分并剥离:

lines=""""http://www.google.com" and "http://www.yahoo.com" and    "http://www.facebook.com"
"https://1.1.1.1" and "ftp://a.a.a.a"""

print([x.strip('"') for x in lines.split(" and ")])

['http://www.google.com', 'http://www.yahoo.com', 'http://www.facebook.com"\n"https://1.1.1.1', 'ftp://a.a.a.a']