使用正则表达式提取网址

时间:2014-08-15 23:22:00

标签: python regex

如何使用正则表达式从以下文本中提取网址:

/url?q=http://www.linkedin.com/in/sujachandrasekaran&sa=u&ei=gptuu5b6kogtyatduicidq&ved=0cbqqfjaa&usg=afqjcnejdwki_gcnxgzsd4apxey1k2swlw

期望的结果是:

http://www.linkedin.com/in/sujachandrasekaran

我用过这个

a = "/url?q=http://www.linkedin.com/in/sujachandrasekaran&sa=u&ei=1jxuu8qxgtwaygs_u4gaaq&ved=0cceqfjaa&usg=afqjcnfl2pecdcddktw_pw9nelfohjp0ca"
linkedin_links = re.findall('(http.*)&',a)

它给了我这个:

u'http://www.linkedin.com/in/sujachandrasekaran&sa=u&ei=1jxuu8qxgtwaygs_u4gaaq&ved=0cceqfjaa'

5 个答案:

答案 0 :(得分:5)

使用适当的工具代替正则表达式...

from urlparse import urlparse, parse_qs

url = '/url?q=http://www.linkedin.com/in/sujachandrasekaran&sa=u&ei=gptuu5b6kogtyatduicidq&ved=0cbqqfjaa&usg=afqjcnejdwki_gcnxgzsd4apxey1k2swlw'
qs = parse_qs(urlparse(url).query)['q']
# ['http://www.linkedin.com/in/sujachandrasekaran']

它将处理转义,多个q参数,您不必担心它在查询参数中出现的位置。

答案 1 :(得分:1)

TL; DR:使用'(http.*?)&'代替'(http.*)&'

你的正则表达式包含.*。这是默认情况下 greedy ,这意味着它会尽可能地匹配。在您的情况下,它将匹配最后&的所有内容(但不包括)。因为您只想匹配第一个&,所以必须使用?修饰符使正则表达式非贪婪。 .*?尝试匹配尽可能少的字符。通常,这是一个空字符串,但因为在你的情况下它必须跟在&后面,它将匹配第一个&

答案 2 :(得分:1)

这是一个简单的正则表达式,可以在大多数情况下正确地完成工作http://[^&]*

....其中[^&]*表示:尽可能多地匹配与&不同的所有字符。但是,更好的正则表达式必须只匹配URL中允许的字符(不是我示例中的所有字符)。

也许使用专用工具是你能做到的最好的工具,但是根据使用正则表达式的任务的复杂性,这可能只是更好和更简单的方法。

答案 3 :(得分:0)

您可以使用此表达式:选择第一组:

  ?

/ URL \ Q =([^&安培;] +)

这将选择/ url?q =之后和&。

之前的所有内容

这将添加对其他网址的支持,例如https和ftp

答案 4 :(得分:0)

#! /usr/bin/python

import re

a = "/url?q=http://www.linkedin.com/in/sujachandrasekaran&sa=u&ei=1jxuu8qxgtwaygs_u4gaaq&ved=0cceqfjaa&usg=afqjcnfl2pecdcddktw_pw9nelfohjp0ca"

output = re.split ("\&", a )

final = re.split ("\=", output [0])

print final [1]