如何使用正则表达式从以下文本中提取网址:
/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'
答案 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]