3

次の形式に従って、サーバー コンソール (Multicraft) からの行を解析できるようにしたいと考えています。

"source" <[ignore]"username"> "message"

以下はチャットの例です。

[Server] <Johndonne> hello everyone!
[Chat] <[VIP][Owner]bit2shift> hey
[Chat] <[Mod]waisman> hello there
[Chat] <[Builder]bluesniper> hey john xD

私の最初の戦略は、この正規表現でした:

^(?P<source>\[[^\]]+\])?\s*<\[.+\](?P<sender>[^>]*)>\s*(?P<message>.*)$

ただし、テキスト文字列が次の場合など、ユーザー名の前に [tag] がない場合は失敗します。

[Server] <Johndonne> hello everyone!

正規表現をテストするために、 re.findall(regex, line) を使用して、パラメータを持つタプルを取得しました。何か案は?

4

2 に答える 2

3

?次のように、0 または 1 の量指定子 ( )を付けることで、その部分をオプションにすることができます。

^(?P<source>\[[^\]]+\])?\s*<(?:\[[^\]]+\])?(?P<sender>[^>]*)>\s*(?P<message>.*)$

しかし、このパターンは[Owner]bit2shift<sender>入力文字列が[Chat] <[VIP][Owner]bit2shift> hey. 0 個以上の量指定子 ( *)を使用して、複数のタグをグループ化したい場合があります。

^(?P<source>\[[^\]]+\])?\s*<(?:\[[^\]]+\])*(?P<sender>[^>]*)>\s*(?P<message>.*)$

bit2shiftこれは、グループ内でのみキャプチャされ<sender>ます。

于 2013-09-04T22:25:27.780 に答える
1

オプションにします:

In [23]: x = """[Server] <Johndonne> hello everyone!
[Chat] <[VIP][Owner]bit2shift> hey
[Chat] <[Mod]waisman> hello there
[Chat] <[Builder]bluesniper> hey john xD"""

In [24]: rx = re.compile('^(?P<source>\[[^\]]+\])?\s*<(?:\[.+\])?(?P<sender>[^>]*)>\s*(?P<message>.*)$')

In [25]: [rx.search(xi) for xi in x.split('\n')]
Out[25]:
[<_sre.SRE_Match at 0x6c3ba48>,
 <_sre.SRE_Match at 0x6c3b7e8>,
 <_sre.SRE_Match at 0x6c3bae0>,
 <_sre.SRE_Match at 0x6c3bb78>]

In [26]: [rx.search(xi).group() for xi in x.split('\n')]
Out[26]:
['[Server] <Johndonne> hello everyone!',
 '[Chat] <[VIP][Owner]bit2shift> hey',
 '[Chat] <[Mod]waisman> hello there',
 '[Chat] <[Builder]bluesniper> hey john xD']
于 2013-09-04T22:25:39.293 に答える