2015-06-05 55 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以捕獲無效的語法。