1

Python で正規表現を 1 つだけ使用して、この文字列を解析する必要があります。グループごとに、特定のフィールドに値を保存する必要があります。問題は、1 つ以上のパラメーターが欠落しているか、順序が異なる可能性があることです。(つまりdomain 66666 ip nonce、中央部分が欠落している)

3249dsf 2013-02-10T06:44:30.666821+00:00 domain constant 66666 sync:[127.0.0.1] Request: pubvalue=kjiduensofksidoposiw&change=09872534&value2=jdmcnhj&counter=232&value3=2&nonce=7896089hujoiuhiuh098h

私は割り当てる必要があります:

  • time=2013-02-10T06:45:30.666821+00:00(定数形式)
  • domain=domain(ストリング)
  • code=66666(整数)
  • ip=127.0.0.1(ストリング)
  • pubvalue=kjiduensofksidoposiw(固定長の文字列)
  • nonce=7896089hujoiuhiuh098h(ストリング)

編集

これは、文字列がどのように変化するかの例です: 123dsf 2014-01-11T06:49:30.666821+00:00 google constant 12356 sync:[192.168.0.1] Request: pubvalue=fggggggeesidoposiw&nonce=7896089hujoiuhiuh098h

道を教えてくれてありがとう。

4

1 に答える 1

1

1 つの正規表現を使用して文字列全体を解析することは、おそらく良い考えではありません。しかし、解決策は使用することだと思いますnamed groups(参照:正規表現チュートリアルの名前付きグループNamed groups(?P<nameofgroup>bla)

したがって、たとえば ip を次のように一致させることができます。

import re
str = "3249dsf 2013-02-10T06:44:30.666821+00:00 domain constant 66666 sync:[127.0.0.1] Request: pubvalue=kjiduensofksidoposiw&change=09872534&value2=jdmcnhj&counter=232&value3=2&nonce=7896089hujoiuhiuh098h"
print re.search("\[(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]", str).groupdict()

この正規表現を、他のものと一致させるために必要なパターンで拡張するだけです。

?のように、グループの括弧の後に a を配置することで、グループをオプションにすることができます(?P<ip>pattern)?。パターンが一致しなかった場合、dict 内の要素は になりますNone

ただし、これを1 つのRegexだけで行うのは得策ではありません。(バックトラッキングなどの理由で)遅くなり、正規表現は長くて維持が複雑になります!

于 2013-02-21T09:32:07.943 に答える