使用正则表达式提取URL
我该如何使用正则表达式从以下文本中提取网址:
/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
你可以使用这个表达式:选择第一个组:
/url\?q=([^&]+)
这个表达式会选中在 /url?q= 后面和 & 前面的所有内容。
这样做可以支持其他类型的链接,比如 https 和 ftp。
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]
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
1
这里有一个简单的正则表达式,可以在大多数情况下正确完成任务:http://[^&]*
。
其中,[^&]*
的意思是:匹配所有不是&
的字符,尽可能多地匹配。不过,更好的正则表达式应该只匹配URL中允许的字符(而不是像我这个例子中那样匹配所有字符)。
也许使用专门的工具是你能做的最好的选择,但根据任务的复杂性,使用正则表达式可能也是一个不错且简单的方法。
1
总结:用 '(http.*?)&'
替代 '(http.*)&'
。
你的正则表达式里用了 .*
,这个默认是 贪婪 的,意思是它会尽量匹配尽可能多的内容。在你的情况里,它会匹配到最后一个 &
前的所有内容(但不包括这个 &
)。因为你只想匹配到第一个 &
,所以需要把正则表达式改成非贪婪的,方法是加上 ?
修饰符。这样 .*?
就会尽量少匹配字符,通常情况下,它会匹配一个空字符串,但因为在你的例子中,它后面必须跟着 &
,所以它会匹配到第一个 &
为止。
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
参数,而且你不需要担心它在查询参数中的位置。