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的位置,我也需要一个能够捕获所有这些的通用正则表达式.
可读性计数(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)
| 归档时间: |
|
| 查看次数: |
6098 次 |
| 最近记录: |