如何去除mIRC用户使用的颜色代码?

8 投票
6 回答
8496 浏览
提问于 2025-04-15 12:08

我正在用Python和irclib写一个IRC机器人,想要记录某些频道的消息。
问题是,有些mIRC用户和一些机器人发送消息时会使用颜色代码
你有没有什么办法可以去掉这些颜色代码,只留下清晰的ASCII文本消息呢?

6 个回答

1

因为我觉得这个问题很有用,所以我想贡献一下我的想法。

我在正则表达式(regex)里加了一些东西。

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

\x16 是用来去掉一个“反向”的字符。\x0f 则是用来去掉另一个加粗的字符。

7

第二个和后面的建议有问题,因为它们在查找数字时,是在任何字符后面查找,而不是在颜色代码字符后面。

我对所有的帖子进行了改进和整合,得出了以下结果:

  • 我们确实会去掉反向字符
  • 去掉颜色代码时,不会在文本中留下数字。

解决方案:

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

14

在我看来,正则表达式是最干净利落的选择。如果你之前没用过正则表达式,这个链接是个不错的学习资源。想了解Python的正则表达式库的详细信息,可以去这里看看。

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

这个正则表达式是用来查找以^C开头的内容(在ASCII中,它的值是\x03,你可以在命令行输入chr(3)来确认),然后可选地查找一个或两个数字([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字符(比如关闭颜色命令的那个)。

撰写回答