Как раздеть цветовые коды, используемые пользователями mIRC? - PullRequest
6 голосов
/ 09 июня 2009

Я пишу IRC-бота на Python, используя irclib, и пытаюсь регистрировать сообщения на определенных каналах.
Проблема в том, что некоторые пользователи mIRC и некоторые боты пишут, используя цветовые коды .
Любая идея о том, как я мог бы раздеть эти части и оставить только текстовое сообщение ASCII?

Ответы [ 7 ]

12 голосов
/ 09 июня 2009

Регулярные выражения - ваша самая чистая ставка на мой взгляд. Если вы не использовали их раньше, это хороший ресурс. Для получения полной информации о библиотеке регулярных выражений Python, перейдите по ссылке здесь .

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

Регулярное выражение ищет ^ C (то есть \ x03 в ASCII , вы можете подтвердить это, выполнив 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'

хаос 'решение аналогично, но может закончиться тем, что съест более двух чисел и также не удалит свободные символы ^ C, которые могут зависать (например, тот, который закрывает команда цвета)

7 голосов
/ 17 августа 2010

Вторые и последующие предложения являются дефектными, поскольку они ищут цифры после любого символа, но не после символа цветового кода.

Я улучшил и объединил все посты со следующими последствиями:

  • мы делаем удаляем обратный символ
  • удалить цветовые коды без , оставляя цифры в тексте.

Решение:

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

1 голос
/ 26 марта 2015

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

1 голос
/ 16 марта 2010

Поскольку я нашел этот вопрос полезным, я решил внести свой вклад.

Я добавил пару вещей в регулярное выражение

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

\x16 убрал «обратный» символ. \x0f избавляется от другого жирного персонажа.

1 голос
/ 09 июня 2009
p = re.compile("\x03\d+(?:,\d+)?")
p.sub('', text)
0 голосов
/ 15 апреля 2015

Я знаю, что написал о желании получить решение для регулярных выражений, потому что оно может быть чище, я создал решение без регулярных выражений, которое работает идеально

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

Спасибо всем за помощь.

0 голосов
/ 20 октября 2009

Мне даже пришлось добавить '\x0f', какое бы использование оно не имело

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