2015-06-05 35 views
0

在这里挣扎着一些正则表达式。我将循环浏览几个网址,但我无法获得如何识别收入或成本并获取它们的正则表达式。本质上,输出会是这个样子:或用正则表达式和python解析url时的语法

import re 

url = ['GET /ca.gif?rb=1631&ca=20564929&ra=%n&pid=&revenue=224.00&cost=', 
     'GET /ca.gif?rb=1631&ca=20564929&ra=%n&pid=&revenue=224.00', 
     'GET /ca.gif?rb=1631&ca=20564929&ra=%n&pid=&revenue=224.00&cost=13'] 
values = [] 
for i in urls: 
    values.append(re.search(r'(?<=revenue=)(.*?)(?=&|;)',url).group(0)) 

print values 

[[224.00, ''], 
'224.00', 
[224.00, 13]] 
+0

我认为最后的列表是您的预期输出。 –

回答

1

您需要使用re.findall因为re.search只返回了第一场比赛。

>>> for i in url: 
     values.append(re.findall(r'(?:\brevenue=|\bcost=)(.*?)(?:[&;]|$)', i)) 


>>> values 
[['224.00', ''], ['224.00'], ['224.00', '13']] 
1

使用urlparse.urlparse解析URL,并urlparse.parse_qs解析查询字符串。

from urlparse import urlparse, parse_qs 

reqs = ['GET /ca.gif?rb=1631&ca=20564929&ra=%n&pid=&revenue=224.00&cost=', 
     'GET /ca.gif?rb=1631&ca=20564929&ra=%n&pid=&revenue=224.00', 
     'GET /ca.gif?rb=1631&ca=20564929&ra=%n&pid=&revenue=224.00&cost=13'] 

urls = [re.split(' +', s, 1)[1] for s in reqs] 

kv = [parse_qs(urlparse(url).query) for url in urls] 

values = [(e.get('revenue'), e.get('cost')) for e in kv] 
# values = [{'revenue': e.get('revenue'), 'cost': e.get('cost')} for e in kv] 

样本输出(parse_qs提供用于每个密钥值的列表,因为查询可能包含重复的键):

[(['224.00'], None), (['224.00'], None), (['224.00'], ['13'])] 

values线不是必需的。您可以直接使用kv字典。

如果你要处理无效的输入,以urlskv列表解析已被改写为一个循环:

  • urls,你需要检查和筛选出的条目,而不HTTP方法
  • 对于kv,您需要为urlparse添加try catch以捕获无效的语法。