8

irclib を使用して Python で IRC ボットを作成しており、特定のチャネルでメッセージをログに記録しようとしています。
問題は、一部の mIRC ユーザーと一部のボットがカラー コードを使用して記述していることです。
これらの部分を取り除き、クリアなASCIIテキストメッセージだけを残す方法について何か考えはありますか?

4

6 に答える 6

14

私の意見では、正規表現が最もクリーンな方法です。以前にそれらを使用したことがない場合、これは優れたリソースです。Python の正規表現ライブラリの詳細については、こちらを参照してください

import re
regex = re.compile("\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)

正規表現は ^C ( ASCIIでは\x03 であり、コマンド ラインで chr(3) を実行することで確認できます) を検索し、オプションで 1 つまたは 2 つの [0-9] 文字を検索し、オプションでその後にカンマを付けます。次に、別の 1 つか 2 つの [0-9] 文字。

(?: ... )は、括弧内に見つかったものを格納することを忘れるように指示します (後方参照する必要がないため) 、? は 0 または 1 に一致することを意味し、{n,m}は前のグループ化の n と m に一致することを意味します。最後に、\dは [0-9] に一致することを意味します。

残りは、上記のリンクを使用してデコードできます。

>>> regex.sub("", "blabla \x035,12to be colored text and background\x03 blabla")
'blabla to be colored text and background blabla'

chaos ' の解決策も同様ですが、最大 2 つ以上の数字を食べてしまう可能性があります。

于 2009-06-09T15:17:27.330 に答える
7

評価が 2 番目以降の提案は欠陥があります。文字の後に数字を検索しますが、カラー コード文字の後には検索しないからです。

すべての投稿を改善して結合した結果、次の結果が得られました。

  • 逆文字を削除します
  • テキストに数字を残さにカラー コードを削除します。

解決:

regex = re.compile("\x1f|\x02|\x12|\x0f|\x16|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)

于 2010-08-17T15:21:24.050 に答える
1

この質問が役に立ったので、私は貢献したいと思いました。

正規表現にいくつか追加しました

regex = re.compile("\x1f|\x02|\x03|\x16|\x0f(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)

\x16「逆」の文字を削除しました。\x0f別の大胆な文字を取り除きます。

于 2010-03-16T01:12:10.500 に答える
1

正規表現ソリューションがよりクリーンになる可能性があるため、正規表現ソリューションが欲しいと投稿したことは知っています。完璧に機能する非正規表現ソリューションを作成しました。

def colourstrip(data):
    find = data.find('\x03')
    while find > -1:
        done = False
        data = data[0:find] + data[find+1:]
        if len(data) <= find+1:
            done = True
        try:
            assert int(data[find])
            data = data[0:find] + data[find+1:]
        except:
            done = True
        try:
            assert not done
            assert int(data[find])
            data = data[0:find] + data[find+1:]
        except:
            if not done and (data[find] != ','):
                done = True
        if (len(data) > find+1) and (data[find] == ','):
            try:
                assert not done
                assert int(data[find+1])
                data = data[0:find] + data[find+1:]
                data = data[0:find] + data[find+1:]
            except:
                done = True
            try:
                assert not done
                assert int(data[find])
                data = data[0:find] + data[find+1:]
            except: pass

        find = data.find('\x03')
    data = data.replace('\x1d','')
    data = data.replace('\x1f','')
    data = data.replace('\x16','')
    data = data.replace('\x0f','')
    return data

datastring = '\x0312,4This is coolour \x032,4This is too\x03'    
print(colourstrip(datastring))

皆様、ご協力ありがとうございました。

于 2015-04-15T08:19:55.057 に答える
0

\x0f用途が何であれ、「 」を追加する必要さえありました

regex = re.compile("\x0f|\x1f|\x02|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
regex.sub('', msg)
于 2009-10-20T01:12:18.053 に答える