无损方法
好处:保留原来字符串的全部内容
缺点:耗内存,需要对源字符串进行url解码
这个是把对应的表情和英文符号进行urlencode 这样就可以保存原有的字符串,不会破坏原来的样式,直接对字符串进行url解码即可
import re
from urllib.parse import quote, unquote
from zhon import hanzi
from zhon.hanzi import punctuation # 标签符号
def emoji_urlencode(self, text):
'''
表情生成urlencode
:param text: 原始文本
:return: 新文本
'''
# 方法一
# r = re.compile("[^\u4e00-\u9fa5"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、"
# "〃《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏!?。。]")
# 方法二
r = re.compile("[^\u4e00-\u9fa5"{}]".format(punctuation))
index_li = [m.start() for m in re.finditer(r, text)] # 找到位置
new_text = '' # 生成新的文本
result = [quote(text[i])for i in index_li] # 替换结果
for index, i in enumerate(text):
if index in index_li:
new_text += result.pop(0)
else:
new_text += text[index]
return new_text
if __name__ == '__main__':
text = '?那一口,戒不掉了'
t = emoji_urlencode(text)
print(t)
print(unquote(t)) # 解码字符串
有损方式
直接替换原有的表情,会影响字原符串的完整性
# -*- coding: utf-8 -*-
import re
def filter_emoji(desstr,restr='[emoji]'):
'''
过滤表情
'''
try:
co = re.compile(u'[\U00010000-\U0010ffff]')
except re.error:
co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
return co.sub(restr, desstr)
if __name__ == '__main__':
print('曼?就是矫')
t = filter_emoji('曼?就是矫')
print(t)