使用正则表达式提取URL

2 投票
5 回答
748 浏览
提问于 2025-04-18 17:28

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

/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 参数,而且你不需要担心它在查询参数中的位置。

撰写回答