题
我正在使用 irclib 用 Python 编写一个 IRC 机器人,并尝试记录某些频道上的消息。
问题是一些 mIRC 用户和一些机器人使用 颜色代码.
我知道如何去掉这些部分并只留下清晰的 ASCII 文本消息吗?
解决方案
正则表达式是在我看来,你干净的赌注。如果你以前没有使用过,这是一个很好的资源。对于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至前一分组的米。最后,的 \ d 表示匹配[0-9]。
的其他部分可以使用我指的是上面的链接被解码。
>>> regex.sub("", "blabla \x035,12to be colored text and background\x03 blabla")
'blabla to be colored text and background blabla'
混乱”溶液是类似的,但可能最终吃比两个数字的最大越来越也不会删除可能挂约任何松散^ C的字符(如一个封闭颜色命令)
其他提示
第二级和以下建议是有缺陷的,因为它们在任何字符之后查找数字,而不是在颜色代码字符之后查找数字。
我改进并合并了所有帖子,结果如下:
- 我们 做 删除反向字符
- 删除颜色代码 没有 在文本中留下数字。
解决方案:
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)
正如我发现这个问题是有用的,我想我会作出贡献。
我添加几个步骤要正则表达式
regex = re.compile("\x1f|\x02|\x03|\x16|\x0f(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
\x16
去掉了 “反向” 字符。 \x0f
摆脱另一粗体字符的
的自动下载,IRSSI有一个很好的一个用Perl,这是蟒蛇:
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
我甚至不得不添加“\x0f
”,它有什么用
regex = re.compile("\x0f|\x1f|\x02|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
regex.sub('', msg)
我知道我张贴想要一个正则表达式的解决方案,因为它可能是更清洁,我创建了一个非正则表达式的解决方案,可以完美运行。
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))
感谢您的所有帮助大家。