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

bar*_*arp 2 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
Run Code Online (Sandbox Code Playgroud)

我想解析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)
Run Code Online (Sandbox Code Playgroud)

但是,当消息出现时

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

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

Ada*_*tan 5

可读性计数(Python的禅宗)

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

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

>>> user=re.compile("User-Agent: (.*?)\n")
Run Code Online (Sandbox Code Playgroud)

使用两个不同的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)']
Run Code Online (Sandbox Code Playgroud)