2

Pythonの正規表現について質問があります。Pythonの正規表現に関する情報はあまりありません。私はHTTPリクエストメッセージを処理していて、それらを正規表現で解析しています。ご存知のように、HTTPGETメッセージはこの形式です。

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の場所が変更された場合でも、それらすべてをキャッチする汎用正規表現が必要です。

4

2 に答える 2

4

読みやすさのカウント(Pythonの禅)

検索する部分式ごとに使用findall()します。このようにして、正規表現は短く、読みやすく、部分式の場所に依存しなくなります。

シンプルで読みやすい正規表現を定義します。

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

2つの異なる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)']
于 2012-05-31T11:54:25.600 に答える
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']
于 2012-05-31T11:57:57.907 に答える