【问题标题】:How to remove ALL IRC Colour codes from string如何从字符串中删除所有 IRC 颜色代码
【发布时间】:2015-05-28 15:37:49
【问题描述】:

注意:我使用的是 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'

【问题讨论】:

  • 一个示例以及预期的输出会更好。
  • 一个例子是12,4红色和蓝色,下划线。控制字符不显示在浏览器中。也许'\003' + '12,4' + '红蓝'+'\003'+', \031Underline\031'
  • 请使用代码块显示代码,如果使用代码块,控制字符可以在浏览器中显示。您可以编辑您的问题以更新该问题
  • 也许这个页面上的一些信息 - ircbeginner.com/ircinfo/colors.html - 应该会有所帮助。从问题来看,您似乎不会删除,而是将这些代码替换为表示它们的单词。然后,您甚至可能不需要正则表达式解决方案...

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


【解决方案1】:

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

我更新了代码以更兼容颜色代码;允许无限的颜色代码编号,因为 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】:

    我整理了一些工作代码,我注意到上一篇类似代码的错误 导致应用程序崩溃。然后注意到代码可能不起作用,我将其修改为这里的样子。此代码应该按预期工作。它没有经过广泛的测试,但我在编码时确实得到了积极的结果。下面的代码正确地从文本中去除所有颜色格式的 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
    

    没有正则表达式可以做到这一点,必须在此处使用此代码。

    【讨论】:

      【解决方案3】:
      [\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

      【讨论】:

      • 对于 \x03,11 \x034 和 \x03,逗号应保留为纯文本。另外我们如何使用该正则表达式?文本 = '\x0312,4文本\x03; striptext = regex_that_returns_plain_text(text)
      • 为什么要留下逗号?您将通过留下一个原本不应该存在的逗号来处理格式错误的颜色代码。整个事情应该被剥夺。至于如何应用,我编辑了答案(不过你可以自己搜索几秒钟就找到了)。
      • ZeroKnight 逗号会保留,因为如果您正在为逗号着色或在逗号处完成颜色,则逗号会保留。它不是畸形的,它就像设计的那样。所以 \x03, Text 所以如果 Text 是一个数字是错误的,因为控制字符后面的空格?在所有情况下,逗号都是文本开始的地方,而不是被删除。
      • ZeroKnight 没有删除文本。 '\x0312, Text' 是一个蓝色逗号,后跟 Text。这就是所有 irc 客户端查看文本的方式。他们不尝试修复损坏的颜色尝试,他们只是结束颜色序列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2014-10-04
      • 1970-01-01
      • 2018-10-23
      • 2012-04-08
      • 2015-03-07
      • 2010-11-04
      相关资源
      最近更新 更多