如何从字符串中删除所有IRC颜色代码

时间:2015-03-25 04:47:39

标签: python regex python-3.x colors irc

注意:我使用的是Python3

我一直在各处搜寻,一无所获。在各地询问IRC。我需要一个正则表达式删除所有IRC颜色控制代码。没有一个完整的解决方案。

粗体,斜体,下划线,反转,彩色和纯文本 字符编号分别为2 29 31 22 3 15。

已编辑:

我刚刚找到了一个\ x0f字符。

颜色字符(3)可能包含最多2位数字,可能的逗号最多可达2位数或没有数字只是字符3.它也可能只是一个带有纯文本的逗号后面的字符例如,逗号应留在字符串中。

请帮助我陷入困境。

示例:

'\003' + '12,4' + 'Red and blue' + '\003'+', \031Underline\031' 

12为蓝色,4为红色,与字符3一起使用。

预期的输出只是"红色和蓝色,下划线"纯文本,没有颜色代码。这样我就可以使用:

line = 'Red and blue, Underline'

line.split(' ')[0] == 'Red'

3 个答案:

答案 0 :(得分:0)

[\x02\x0F\x16\x1D\x1F]|\x03(\d{,2}(,\d{,2})?)?

这将匹配您提到的所有IRC格式代码。对于颜色代码,它甚至会捕获格式错误的代码,例如\x03,11\x034,\x03,。我意识到这可能是理想的,也可能不是理想的,这取决于你希望如何处理那些格式错误的代码,但你可以很容易地调整它来做你想做的事情。如果需要,你可以解释你喜欢那些处理方式,我可以更新答案以反映这一点。

至于做什么,一个解决方案是:

pattern = r'[\x02\x0F\x16\x1D\x1F]|\x03(\d{,2}(,\d{,2})?)?';
text = '\x0312,4Text\x03';
stripped = re.sub(pattern, '', text);

另请参阅Python文档的Section 6.2

答案 1 :(得分:0)

我知道我要求使用正则表达式解决方案,但我终于开始编写一个有效的非正则表达式解决方案。

我更新了代码以便与颜色代码更兼容;允许无限颜色代码编号,因为irc客户端从第一种颜色开始包裹颜色(0是白色)来自颜色列表的结尾等等。所以现在colourstrip()将处理它们的颜色数而不是旧代码,要求颜色数最多为2位,无论如何都是没有意义的。

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 not done
            assert int(data[find])
            while True:
                assert int(data[find])
                data = data[0:find] + data[find+1:]
        except:
            if not done:
                if data[find] != ',': done = True

        if (not done) and (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
                while True:
                    assert int(data[find])
                    data = data[0:find] + data[find+1:]
            except: pass

        find = data.find('\x03')
    data = data.replace('\x02','')
    data = data.replace('\x1d','')
    data = data.replace('\x1f','')
    data = data.replace('\x16','')
    data = data.replace('\x0f','')
    return data

datastring = '\x03123434,27384This is coolour \x032689,34344This is too\x03'
print(colourstrip(datastring))

感谢大家的帮助。

答案 2 :(得分:0)

我整理了一些可以工作的代码,我注意到上一篇类似代码的帖子中有一个错误 导致应用程序崩溃。然后注意到代码很可能不起作用,我将其修改为这里的样子。此代码应该按预期工作。它没有经过广泛的测试,但我在编码时确实得到了积极的结果。下面的代码正确地从文本中剥离了所有颜色格式的 mIRC 代码;这次。 :/

> def colourstrip(text_with_msl_colour):
>     find = text_with_msl_colour.find('\x03')
>     while find > -1:
>         find_end = find + 1
>         done = False
>         text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
>         if len(text_with_msl_colour) - 1 <= find_end:
>             done = True
>         try:
>             assert not done
>             done = True
>             assert int(text_with_msl_colour[find]) >= 0
>             done = False
>             text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
>             if len(text_with_msl_colour) - 1 <= find_end:
>                 done = True
>             assert int(text_with_msl_colour[find]) >= 0
>             text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
>         except:
>             pass
>         if not done:
>             if len(text_with_msl_colour) >= find_end and text_with_msl_colour[find] != ',': done = True
>         if (not done) and (len(text_with_msl_colour) > find_end) and (text_with_msl_colour[find] == ','):
>             try:
>                 text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
>                 assert int(text_with_msl_colour[find]) >= 0
>                 text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
>                 assert int(text_with_msl_colour[find]) >= 0
>                 text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
>                 done = True
>             except:
>                 done = True
>         find = text_with_msl_colour.find('\x03')
>     text_with_msl_colour = text_with_msl_colour.replace('\x02', '')
>     text_with_msl_colour = text_with_msl_colour.replace('\x1d', '')
>     text_with_msl_colour = text_with_msl_colour.replace('\x1f', '')
>     text_with_msl_colour = text_with_msl_colour.replace('\x16', '')
>     text_with_msl_colour = text_with_msl_colour.replace('\x0f', '')
>     return text_with_msl_colour

没有正则表达式可以做到这一点,必须用这里的代码来完成。