Cómo quitar los códigos de colores utilizados por los usuarios de mIRC?

StackOverflow https://stackoverflow.com/questions/970545

  •  13-09-2019
  •  | 
  •  

Pregunta

Estoy escribiendo un bot de IRC en Python usando irclib y yo estoy tratando de registrar los mensajes en ciertos canales.
El problema es que algunos usuarios de mIRC y algunos bots escriben haciendo uso de códigos de color .
Cualquier idea sobre cómo podría despojar a esas partes y dejar sólo el mensaje de texto ASCII claro?

¿Fue útil?

Solución

Las expresiones regulares son su apuesta más limpia en mi opinión. Si usted no los ha utilizado antes, este es un buen recurso. Para los detalles sobre la biblioteca de expresiones regulares de Python, vaya aquí .

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

Las búsquedas de expresiones regulares para ^ C (que es \ x03 en ASCII , puede confirmar por haciendo chr (3) en la línea de comandos), y luego mira opcionalmente por uno o dos [0-9] caracteres, a continuación, opcionalmente seguido por una coma y luego otro uno o dos [0-9] caracteres.

(?: ...) dice que olvidarse de almacenamiento de lo que se encontró en el paréntesis (ya que no es necesario que retrorreferencia), significa que partido 0 o 1 y {n, m} significa para que coincida con n a m de la agrupación anterior. Finalmente, \ d significa para que coincida con [0-9].

El resto puede ser decodificada utilizando los enlaces me refiero anteriormente.

>>> regex.sub("", "blabla \x035,12to be colored text and background\x03 blabla")
'blabla to be colored text and background blabla'

caos ' solución es similar, pero puede terminar comiendo más de un máximo de dos números y tampoco eliminará cualquier sueltos ^ C caracteres que pueden ser colgados sobre (como el que cierra el comando de color)

Otros consejos

El segundo clasificado y siguientes sugerencias son defectuosos, en su búsqueda de dígitos después de cualquier naturaleza que sean, pero no después de que el carácter de código de color.

he mejorado y combinado todos los mensajes, con las siguientes consecuencias:

  • DO eliminar el carácter inverso
  • Eliminar códigos de color sin dejando dígitos en el texto.

Solución:

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

p = re.compile("\x03\d+(?:,\d+)?")
p.sub('', text)

Como ya he encontrado útil esta pregunta, pensé que había que aportar.

He añadido un par de cosas a la expresión regular

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

\x16 elimina el carácter "inverso". \x0f se deshace de otro personaje negrita.

MrcAuto-irssi tenía una muy buena escrito en Perl, aquí está en 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

incluso tuve que añadir '\x0f', sea cual sea el uso que tiene

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

Sé que he publicado querer una solución de expresiones regulares, ya que podría ser más limpio, he creado una solución no expresiones regulares que funciona perfecto.

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

Gracias por toda la ayuda a todos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top