如何剥离mIRC用户使用的颜色代码?

时间:2009-06-09 14:55:08

标签: python irc

我正在使用irclib在Python中编写IRC bot,我正在尝试在某些频道上记录消息。
问题是一些mIRC用户和一些Bots使用color codes编写 关于如何剥离这些部分并只留下明确的ascii文本消息的任何想法?

7 个答案:

答案 0 :(得分:12)

在我看来,正则表达式是你最干净的赌注。如果您之前没有使用它们,this是一个很好的资源。有关Python正则表达式库的完整详细信息,请转到here

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

正则表达式搜索^ C(在ASCII中是\ x03,您可以通过在命令行上执行chr(3)来确认),然后可选地查找一个或两个[0-9]字符,然后可选地后面跟一个逗号,然后是另外一个或两个[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 '解决方案类似,但最终可能会吃掉两个以上的数字,并且也不会删除任何可能悬挂的松散^ C字符(例如关闭的字符)颜色命令)

答案 1 :(得分:7)

第二等级及以下建议有缺陷,因为它们会在任何字符后查找数字,但不会在颜色代码字符后查找。

我对所有帖子进行了改进和组合,结果如下:

  • 我们执行删除反向字符
  • 删除颜色代码,无在文本中留下数字。

解决方案:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

当我发现这个问题有用时,我想我会做出贡献。

我在正则表达式中添加了几个东西

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

\x16删除了“反向”字符。 \x0f摆脱了另一个大胆的角色。

答案 4 :(得分:1)

AutoDl-irssi有一个用perl编写的非常好的文件,这里是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

答案 5 :(得分:0)

我甚至不得不添加“\x0f”,无论它有什么用途

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

答案 6 :(得分:0)

我知道我发布了想要一个正则表达式解决方案,因为它可能更干净,我创建了一个非完美的非正则表达式解决方案。

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

感谢所有人的帮助。