Python使用re与string模块清理字符串无法删除emoji表情怎么解决
问题原因
你当前使用的string.printable仅覆盖ASCII可打印字符,而emoji属于Unicode扩展字符集,不在该范围内,因此不会被正则匹配删除。
解决方案
方案1:使用第三方emoji库(推荐,准确率高)
这种方法无需手动维护emoji的Unicode范围,适配所有常见emoji,操作最简单。
首先安装依赖:pip install emoji
修改后的完整代码:
import re import string import emoji s = '''Hi !こんにちは、私の給料は月額10000ドルです。 XO XO 私はあなたの料理が大好きです 私のフライトはAPX1999です。🌕💕 私はサッカーの試合を見るのが大好きです。 ''' # 先删除ASCII可打印字符 replaced = re.sub(f'[{string.printable}]', '', s) # 再删除所有emoji replaced = emoji.replace_emoji(replaced, replace='') print(replaced)
方案2:纯标准库实现,手动匹配emoji Unicode范围
如果不想安装第三方依赖,可以直接用正则匹配emoji的Unicode通用范围进行删除,修改代码如下:
import re import string s = '''Hi !こんにちは、私の給料は月額10000ドルです。 XO XO 私はあなたの料理が大好きです 私のフライトはAPX1999です。🌕💕 私はサッカーの試合を見るのが大好きです。 ''' # 先删除ASCII可打印字符 replaced = re.sub(f'[{string.printable}]', '', s) # 匹配emoji范围并删除 emoji_pattern = re.compile("[" u"\U0001F600-\U0001F64F" # 表情类emoji u"\U0001F300-\U0001F5FF" # 符号/象形类emoji u"\U0001F680-\U0001F6FF" # 交通/符号类emoji u"\U0001F1E0-\U0001F1FF" # 国旗类emoji "]+", flags=re.UNICODE) replaced = emoji_pattern.sub('', replaced) print(replaced)
拓展方案:正向匹配保留所需字符(更适合当前场景)
如果你清理的目标就是保留日文汉字、假名和日文标点,直接正向匹配保留内容反而更稳妥,不会漏掉其他未知的特殊字符:
import re s = '''Hi !こんにちは、私の給料は月額10000ドルです。 XO XO 私はあなたの料理が大好きです 私のフライトはAPX1999です。🌕💕 私はサッカーの試合を見るのが大好きです。 ''' # 仅保留日文假名、汉字、日文常见标点 jp_pattern = re.compile(r'[^\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF\u3000-\u303F、。]') replaced = jp_pattern.sub('', s) print(replaced)
以上三种方案运行后都可以得到你需要的预期输出。
内容的提问来源于stack exchange,提问作者sirimiri
相关产品推荐
相关产品推荐

