0

正規表現を使用して、次の形式のメッセージを解析しようとしています:

  • /log/<sender>
  • /error/<sender>
  • /state/<sender>/<variable_name>

stateメッセージのタイプ、メッセージの送信者、およびメッセージがメッセージの場合は変数名を取得できるようにしたいと考えています。ログおよびエラー メッセージには、このスキーマの変数名を含めることができないことに注意してください。

私は次のパターンでこれをやってみました:

address_pattern = re.compile(
    r'''/
       ((?P<type> log)/(?P<sender> [^/]*))
     | ((?P<type> error)/(?P<sender> [^/]*))
     | ((?P<type> state)/(?P<sender> [^/]*)/(?P<parameter> [^/]*))
    ''', re.VERBOSE)

<type>ただし、キャプチャ グループと<sender>が複数回定義されているため、これは有効なパターンではありません(ただし、論理的には 1 つだけが一致します)。

この文字列を解析して 3 つの一致を提供できる単一の正規表現はありますか?

4

2 に答える 2

2

どうですか:

r'/(?P<type>log|error|state)/(?P<sender>[^/]+)(?:/(?P<parameter>[^/]+))?'

?

後でセマンティクスを確認し、人々が のようなものを試した場合はエラーをスローできます/error/<sender>/<variable>

正規表現は制限されています。定義上、以前の試合に基づいて後で決定を下すことはできません。一部の構文 (Python など) では、以前の一致をチートして再利用できます。例えばr'<(a|p|div)></\1>'、しかしそれはあなたが行くことができる限りです。それ以外の場合は、 DFAに限定されます。

于 2013-04-23T17:50:16.100 に答える
0

100% 正規表現ではないが、同等に動作するソリューションを見つけました。

sあなたが持っている文字列の場合

state_pat = re.compile(r'/(?P<type>state)/(?P<sender>[^/]+)/(?P<parameter>[^/]+)')
log_pat = re.compile(r'/(?P<type>(log|warning|error))/(?P<sender>[^/]+)')
ping_pat = re.compile(r'/(?P<type>ping)/(?P<sender>[^/]+)')

match = state_pat.match(s) or log_pat.match(s) or ping_pat.match(s)

基本的に、グループ名の再利用を必要とする各論理を独自のパターンに分割し、の短絡を使用しorて最初に一致したものを返します。次に、どのパターンが一致したかをテストするために使用できmatch.group('type')、動作は元の質問で期待どおりです。

同様に、 などの文字列/log/sender/parameterは一致せず、 you が返されNoneます。

于 2013-04-24T11:49:17.450 に答える