或使用正则表达式解析网址时的语法蟒

时间:2015-06-05 01:09:11

标签: python regex

在这里挣扎着一些正则表达式。我将循环浏览几个网址,但我无法获得正则表达式如何识别收入或成本并抓住它们。基本上输出看起来像这样:

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]]

2 个答案:

答案 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 :(得分:1)

使用urlparse.urlparse解析网址,使用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 dict。

如果您必须处理无效输入,则必须将包含urlskv的列表修改重写为循环:

  • 对于urls,您需要检查并过滤掉没有HTTP方法的条目
  • 对于kv,您需要为urlparse添加try catch以捕获无效语法。