注意:我使用的是Python3
我一直在各处搜寻,一无所获。在各地询问IRC。我需要一个正则表达式删除所有IRC颜色控制代码。没有一个完整的解决方案。
粗体,斜体,下划线,反转,彩色和纯文本 字符编号分别为2 29 31 22 3 15。
已编辑:
我刚刚找到了一个\ x0f字符。
颜色字符(3)可能包含最多2位数字,可能的逗号最多可达2位数或没有数字只是字符3.它也可能只是一个带有纯文本的逗号后面的字符例如,逗号应留在字符串中。
请帮助我陷入困境。
示例:
'\003' + '12,4' + 'Red and blue' + '\003'+', \031Underline\031'
12为蓝色,4为红色,与字符3一起使用。
预期的输出只是"红色和蓝色,下划线"纯文本,没有颜色代码。这样我就可以使用:
line = 'Red and blue, Underline'
line.split(' ')[0] == 'Red'
答案 0 :(得分:0)
[\x02\x0F\x16\x1D\x1F]|\x03(\d{,2}(,\d{,2})?)?
这将匹配您提到的所有IRC格式代码。对于颜色代码,它甚至会捕获格式错误的代码,例如\x03,11
,\x034,
和\x03,
。我意识到这可能是理想的,也可能不是理想的,这取决于你希望如何处理那些格式错误的代码,但你可以很容易地调整它来做你想做的事情。如果需要,你可以解释你喜欢那些处理方式,我可以更新答案以反映这一点。
至于做什么,一个解决方案是:
pattern = r'[\x02\x0F\x16\x1D\x1F]|\x03(\d{,2}(,\d{,2})?)?';
text = '\x0312,4Text\x03';
stripped = re.sub(pattern, '', text);
另请参阅Python文档的Section 6.2。
答案 1 :(得分:0)
我知道我要求使用正则表达式解决方案,但我终于开始编写一个有效的非正则表达式解决方案。
我更新了代码以便与颜色代码更兼容;允许无限颜色代码编号,因为irc客户端从第一种颜色开始包裹颜色(0是白色)来自颜色列表的结尾等等。所以现在colourstrip()将处理它们的颜色数而不是旧代码,要求颜色数最多为2位,无论如何都是没有意义的。
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 not done
assert int(data[find])
while True:
assert int(data[find])
data = data[0:find] + data[find+1:]
except:
if not done:
if data[find] != ',': done = True
if (not done) and (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
while True:
assert int(data[find])
data = data[0:find] + data[find+1:]
except: pass
find = data.find('\x03')
data = data.replace('\x02','')
data = data.replace('\x1d','')
data = data.replace('\x1f','')
data = data.replace('\x16','')
data = data.replace('\x0f','')
return data
datastring = '\x03123434,27384This is coolour \x032689,34344This is too\x03'
print(colourstrip(datastring))
感谢大家的帮助。
答案 2 :(得分:0)
我整理了一些可以工作的代码,我注意到上一篇类似代码的帖子中有一个错误 导致应用程序崩溃。然后注意到代码很可能不起作用,我将其修改为这里的样子。此代码应该按预期工作。它没有经过广泛的测试,但我在编码时确实得到了积极的结果。下面的代码正确地从文本中剥离了所有颜色格式的 mIRC 代码;这次。 :/
> def colourstrip(text_with_msl_colour):
> find = text_with_msl_colour.find('\x03')
> while find > -1:
> find_end = find + 1
> done = False
> text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
> if len(text_with_msl_colour) - 1 <= find_end:
> done = True
> try:
> assert not done
> done = True
> assert int(text_with_msl_colour[find]) >= 0
> done = False
> text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
> if len(text_with_msl_colour) - 1 <= find_end:
> done = True
> assert int(text_with_msl_colour[find]) >= 0
> text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
> except:
> pass
> if not done:
> if len(text_with_msl_colour) >= find_end and text_with_msl_colour[find] != ',': done = True
> if (not done) and (len(text_with_msl_colour) > find_end) and (text_with_msl_colour[find] == ','):
> try:
> text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
> assert int(text_with_msl_colour[find]) >= 0
> text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
> assert int(text_with_msl_colour[find]) >= 0
> text_with_msl_colour = text_with_msl_colour[0:find] + text_with_msl_colour[find_end:]
> done = True
> except:
> done = True
> find = text_with_msl_colour.find('\x03')
> text_with_msl_colour = text_with_msl_colour.replace('\x02', '')
> text_with_msl_colour = text_with_msl_colour.replace('\x1d', '')
> text_with_msl_colour = text_with_msl_colour.replace('\x1f', '')
> text_with_msl_colour = text_with_msl_colour.replace('\x16', '')
> text_with_msl_colour = text_with_msl_colour.replace('\x0f', '')
> return text_with_msl_colour
没有正则表达式可以做到这一点,必须用这里的代码来完成。