我对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的位置。
答案 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']