Cómo quitar los códigos de colores utilizados por los usuarios de mIRC?
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?
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.