【问题标题】:How to strip color codes used by mIRC users?如何去除 mIRC 用户使用的颜色代码?
【发布时间】:2009-06-09 14:55:08
【问题描述】:

我正在使用 irclib 在 Python 中编写一个 IRC 机器人,并且我正在尝试在某些频道上记录消息。
问题是一些 mIRC 用户和一些 Bot 使用 color codes 编写。
关于如何剥离这些部分并只留下清晰的 ascii 文本消息的任何想法?

【问题讨论】:

标签: python irc


【解决方案1】:

在我看来,正则表达式是你最干净的选择。如果您以前没有使用过它们,this 是一个很好的资源。有关 Python 正则表达式库的完整详细信息,请转至 here

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 字符(例如关闭的那个)颜色命令)

【讨论】:

  • 完美,谢谢。很好的答案和很好的解释。我添加了 \x1f|\x02|这样它也会过滤粗体和下划线。 re.compile("\x1f|\x02|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
【解决方案2】:

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

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

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

解决方案:

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

【讨论】:

    【解决方案3】:

    因为我发现这个问题很有用,所以我想我会做出贡献。

    我在正则表达式中添加了一些东西

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

    \x16 删除了“反向”字符。 \x0f 去掉了另一个粗体字。

    【讨论】:

      【解决方案4】:

      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

      【讨论】:

      • 分步做是不正确的,你必须用一个替换来做。例如,您的代码会将'\x03\x033,012345' 转换为'45',但它应该将其转换为'2345'
      【解决方案5】:

      我知道我发布了想要一个正则表达式解决方案,因为它可能更干净,我创建了一个完美的非正则表达式解决方案。

      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))
      

      感谢大家的帮助。

      【讨论】:

        【解决方案6】:

        我什至不得不添加'\x0f',不管它有什么用处

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-21
          • 1970-01-01
          • 2012-03-03
          • 2019-02-15
          • 1970-01-01
          • 2013-04-28
          • 1970-01-01
          相关资源
          最近更新 更多