2009-06-09 5 views
6

irclibを使ってPythonでIRCボットを作成していますが、特定のチャネルでメッセージを記録しようとしています。
一部のmIRCユーザーと一部のボットがcolor codesを使用して書き込みます。
どのように私はそれらの部分を取り除くことができ、明確なasciiテキストメッセージだけを残すことができますか?mIRCユーザーが使用する色コードを削除する方法は?

+2

チャンネル+ Sを設定:P – Eevee

答えて

12

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

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

C(ASCIIで\ X03です、あなたは(3)コマンドラインでCHRを行うことによって確認することができます)、その後、必要に応じて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' 

混乱はのソリューションも同様ですが、2つの数の最大値以上のものを食べ終わる可能性があり、また、約ハングすることができる任意の緩い^ Cの文字を削除しないであろう(例えば閉じ一つとしてカラーコマンド)

+0

完璧、ありがとう。ニースの答えと大きな説明。 \ x1f | \ x02 |を追加しました。太字と下線もフィルタリングします。 re.compile(?\ x1f | \ x02 | \ x03(?:\ d {1,2}(?:、\ d {1,2})?)? "、re.UNICODE) – daniels

1
p = re.compile("\x03\d+(?:,\d+)?") 
p.sub('', text) 
0

私も私は私が貢献したい考え出し、この質問が有用であることが判明したようには

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

を持っているものは何でも使用、「\x0f」を追加する必要がありました。

私は正規表現

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

\x16にカップルの事を追加しましたが、 "逆" の文字を削除しました。 \x0fは太字の文字を取り除きます。

7

2番目の評価とそれに続く提案は、文字の後に数字を探すが、カラーコード文字の後ろにはないので、欠陥があります。

私は次のような結果で、すべての記事を改善し、組み合わせています:

  • 我々は、テキスト内の数字を残してずに逆の文字を削除し
  • 削除カラーコードを実行します

ソリューション:のAutoDL-のirssiはPerlで書かれた非常に良いものを持っていた

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

1

、ここではPythonである:

def stripMircColorCodes(line) : line = re.sub("\x03\d\d?,\d\d?","",line) line = re.sub("\x03\d\d?","",line) line = re.sub("[\x01-\x1F]","",line) return line

0

私は私が望んで掲示知っていますregexソリューションはクリーナーかもしれないので、私は完璧に動作する正規表現以外のソリューションを作成しました。

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)) 

ありがとうございました。

関連する問題