有一堆包含表情(微信表情)的文本,要计算情绪量。
表情和普通文本需要分开命中情绪词典。
这里解决的是将字符串中的表情和普通文本拆分开来的问题。
有两种方法:
- 用正则表达式查找和移除表情
- 用表情分隔符 ‘[’ 和 ‘]’ 将文本拆开,然后合并
# -*- coding: utf-8 -*-
"""
Created on Thu Mar 19 16:37:54 2020
@author: weisssun
"""
#有一段包含表情的字符串,要将表情和文本拆分
#————————————————————————————————————————————
#第一个思路是用正则表达式直接查找
#正则表达式查找方法:
#import re
#pattern = re.compile('正则表达式')
#text = '一段字符串'
#result = pattern.findall(text)
#表情的正则表达式:
#emojis = re.compile(r'\[.\]|\[..\]|\[...\]|\[....\]')
#参考链接:https://zhuanlan.zhihu.com/p/110912040
import re
content = 'BGM好好听[皱眉][皱眉][皱眉][皱眉]又骗我买香水[傲慢]我期待邂逅[傲慢][笑中带泪]'
#content是需要拆分的字符串
emoji_pattern = re.compile(r'\[.\]|\[..\]|\[...\]|\[....\]')
#定义表情的正则表达式方法
emojis = emoji_pattern.findall(content)
#从字符串中查找所有符合表情格式的内容
print(emojis)
#输出的是字符串列表
#['[皱眉]', '[皱眉]', '[皱眉]', '[皱眉]', '[傲慢]', '[傲慢]', '[笑中带泪]']
text = emoji_pattern.sub('', content)
#将表情移除,剩下的是文本
print(text)
#输出的是字符串
#——————————————————————————————————————————————
#第二个是使用 '[' 和 ']' 拆分文本的思路
#学习其他人的代码,有两个地方不明白
import copy
content = '啊[皱眉][皱眉][皱眉][皱眉]又骗我买香水[傲慢]我期待邂逅[傲慢][笑中带泪]'
emojilist = []
first_emoji_pos = content.find('[')
#找到字符串中第一个 emoji表情 的位置
pieces = content.split('[')
#将字符串用 '[' 分割开来,分成多个碎片
#输出的是字符串列表,列表中的每个元素是一个碎片
#表情现在在单个碎片的最前方,如: 傲慢]我期待邂逅红色的毛爷爷
#一个碎片里只会有一个表情
text = pieces[0]
#pieces[0] 是第一个表情的 '[' 之前的文本
#如果前面没有文本,pieces[0] 就是空字符串
for piece in pieces:
#挨个处理每个碎片
emoji_pos_r = piece.find(']')
#找到碎片中 ']' 的位置
#碎片中的 ']' 是表情和文本分分界线
#print(emoji_pos_r),为啥第一个是-1呢?不理解
if emoji_pos_r >= 0:
text = text + piece[(emoji_pos_r + 1):]
#piece[(emoji_pos_r + 1):] 是单个碎片中 ']' 之后的文本
#将第一个 '[' 之前的文本,和每个碎片 ']' 之后的文本合并起来
#最终得到字符串中所有的文本
emoji = '[' + piece[:emoji_pos_r] + ']'
#piece[:emoji_pos_r] 是单个碎片中 ']' 之前的内容,也就是表情
#给表情前后加上 '[' 和 ']', 得到单个碎片中表情的完整版
emojilist.append(copy.deepcopy(emoji))
#将每个碎片里的表情拷贝后添加到列表中
#这里为什么要用deepcopy呢?可能是为了避免某种错误?
print(text)
#字符串中的文本
print(emojilist)
#字符串中的表情