HTTP请求标头的Python正则表达式

时间:2012-05-31 11:47:40

标签: python regex regex-negation

我对Python正则表达式有疑问。我没有太多关于Python正则表达式的信息。我正在使用HTTP请求消息并使用正则表达式解析它们。如您所知,HTTP GET消息采用这种格式。

GET / HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: 10.2.0.12
Connection: Keep-Alive

我想解析消息的URI,方法,用户代理和主机区域。我这份工作的正则表达方式是:

r'^({0})\s+(\S+)\s+[^\n]*$\n.*^User-Agent:\s*(\S+)[^\n]*$\n.*^Host:\s*(\S+)[^\n]*$\n'.format('|'.join(methods)), re.MULTILINE|re.DOTALL)

但是,当消息出现时像

GET / HTTP/1.0
Host: 10.2.0.12
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Connection: Keep-Alive

由于主机位置或用户代理已更改,我无法捕获它们。因此,我需要一个能够捕获所有这些的通用正则表达式,即使在消息中更改了host,method,uri的位置。

2 个答案:

答案 0 :(得分:5)

  

可读性计数(The Zen of Python)

对要查找的每个子表达式使用findall()。这样,正则表达式将是简短的,可读的,并且与子表达式的位置无关。

定义一个简单易读的正则表达式:

>>> user=re.compile("User-Agent: (.*?)\n")

使用两个不同的http标头测试它:

>>> s1='''GET / HTTP/1.0
    Host: 10.2.0.12
    User-Agent: Wget/1.12 (linux-gnu)
    Accept: */*
    Connection: Keep-Alive'''
>>> s2='''GET / HTTP/1.0
    User-Agent: Wget/1.12 (linux-gnu)
    Accept: */*
    Host: 10.2.0.12
    Connection: Keep-Alive'''
>>> user.findall(s1)
['Wget/1.12 (linux-gnu)']
>>> user.findall(s2)
['Wget/1.12 (linux-gnu)']

答案 1 :(得分:2)

将整个标题解析为如此的字典?

headers = """GET / HTTP/1.0
Host: 10.2.0.12
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Connection: Keep-Alive"""


headers = headers.splitlines()
firstLine = headers.pop(0)
(verb, url, version) = firstLine.split()
d = {'verb' : verb, 'url' : url, 'version' : version}
for h in headers:
    h = h.split(': ')
    if len(h) < 2:
        continue
    field=h[0]
    value= h[1]
    d[field] = value

print d

print d['User-Agent']
print d['url']