8

我正在使用 irclib 在 Python 中编写一个 IRC 机器人,并且我正在尝试在某些频道上记录消息。
问题是一些 mIRC 用户和一些 Bot 使用颜色代码编写。
关于如何剥离这些部分并只留下清晰的 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) 来确认),然后可选地查找一个或两个 [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 字符(例如关闭颜色命令的字符)

于 2009-06-09T15:17:27.330 回答
7

二级和以下建议是有缺陷的,因为它们在任何字符之后寻找数字,而不是在颜色代码字符之后。

我改进并合并了所有帖子,结果如下:

  • 我们确实删除了反向字符
  • 删除颜色代码而不在文本中留下数字。

解决方案:

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

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

于 2015-03-26T13:30:43.297 回答
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 回答