或使用正则表达式解析URL时的语法&;python

或使用正则表达式解析URL时的语法&;python,python,regex,Python,Regex,正在和一些正则表达式斗争。我将通过几个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.

正在和一些正则表达式斗争。我将通过几个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]]
重新导入
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']
值=[]
对于URL中的i:

values.append(re.search(r')(?您需要使用
re.findall
因为
re.search
只返回第一个匹配项

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


>>> values
[['224.00', ''], ['224.00'], ['224.00', '13']]
用于解析URL和解析查询字符串

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
提供每个键的值列表,因为查询可能包含重复的键):

行不是必需的。您可以直接使用
kv
dict

如果必须处理无效输入,则必须将带有
URL
kv
的列表改写为循环:

  • 对于
    URL
    ,您需要在不使用HTTP方法的情况下检查和筛选条目
  • 对于
    kv
    ,需要为
    urlparse
    添加try-catch以捕获无效语法

我认为最后一个列表是您的预期输出。
[(['224.00'], None), (['224.00'], None), (['224.00'], ['13'])]