0

私はできる限りプログラミングを学んでおり、Python から始めています。私は現在、IRC 統計ジェネレーターを作成しており (まだ十分ではないかのように)、特定のログ形式でユーザー名 (およびユーザー名のみ) に一致する正規表現を考え出そうとしています。ただし、私が持っているものは re.search とは一致しません

ログ形式の例を次に示します。

may 01 14:04:54 <FishCream> Wahoo!
may 01 14:05:01 <LpSamuelm> Oh, if only talking was this fun in real life.
jan 01 00:00:00 <Username>  Message goes here.
jan 01 00:00:00 *   Username Action goes here.

コンパイルステートメントは次のとおりです。

findusername = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]\s<([A-Za-z]+)>")
finduseraction = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]\s\*\s+([A-Za-z]+)\s")

ご覧のとおり、ユーザーが話しているときと /me コマンドを使用しているときにユーザー名を見つけるための 2 つの別々のステートメントを作成しました。これら 2 つに対して 1 つのスーパー正規表現を作成することはおそらく可能ですが、このままでは十分に頭痛の種になります。

誰でも問題を特定するのを手伝ってもらえますか?

4

1 に答える 1

0

あなたの[0-9:]クラスは、そこにある8文字ではなく、1文字のみに一致します。数量詞を追加します。

findusername = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]{8}\s<([A-Za-z]+)>")
finduseraction = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]{8}\s\*\s+([A-Za-z]+)\s")

これは、毎回別の行にエントリがあることを前提としています。re.MULTILINEログ テキストが一度に複数行で構成される場合は、フラグを追加します。

入力例でre.MULTILINEフラグを使用したデモ:.findall()

>>> findusername = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]{8}\s<([A-Za-z]+)>", re.MULTILINE)
>>> finduseraction = re.compile("^[a-zA-Z]+\s[0-9]+\s[0-9:]{8}\s\*\s+([A-Za-z]+)\s", re.MULTILINE)
>>> findusername.findall(logs)
['FishCream', 'LpSamuelm', 'Username']
>>> finduseraction.findall(logs)
['Username']
于 2013-05-01T19:49:23.410 に答える