如何去除mIRC用户使用的颜色代码?
我正在用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字符(比如关闭颜色命令的那个)。