Python string中删除(过滤)

发布时间:2019-08-22 08:04:22编辑:auto阅读(2037)

    最近做了一个需求,把公众号的用户信息同步到服务端,发现很多用户的昵称里面都有表情符号(emoji), 一般的处理方式是把MySQL的编码改成 utf8mb4,后来讨论了下,这些表情也没什么用,入库的时候直接删除就好了。

    过滤方法

    Python怎么过滤 emoji表情符号呢? 下面是剔除表情字符串的代码片段 python2.7 下测试

    import re
    
    emoji_pattern = re.compile(
        u"(\ud83d[\ude00-\ude4f])|"  # emoticons
        u"(\ud83c[\udf00-\uffff])|"  # symbols & pictographs (1 of 2)
        u"(\ud83d[\u0000-\uddff])|"  # symbols & pictographs (2 of 2)
        u"(\ud83d[\ude80-\udeff])|"  # transport & map symbols
        u"(\ud83c[\udde0-\uddff])"  # flags (iOS)
        "+", flags=re.UNICODE)
    
    def remove_emoji(text):
        return emoji_pattern.sub(r'', text)

    参考 removing-emojis-from-a-string-in-python , 如果正则没有写对 还可以遇到 sre_constants.error: bad character range 之类的错误 。

    这里根据 unicode 范围来删除表情符号,通用的和IOS中的,应该不是很全,也没找到非常全的list。后面证实还是有写过滤不掉,最好还是把字段改成utf8mb4。。如果有更全的过滤方法,欢迎分享

    修改字符编码

    不能完全过滤又要存储,只好修改 带有 emoji 表情字段 的编码设置 (mysql5.6测试)

    ALTER TABLE `table_name` MODIFY `nickname` VARCHAR(40) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;

    因为MySQL 存储 utf8mb4 时候使用 4 个字节,比直接使用utf8占用的空间更多 charset-unicode-utf8mb4,所以请重新考虑下字段的长度 , 否则可能会出现 (1406, "Data too long for column 'nickname' at row 1") 之类的错误。

    其他

关键字