2017-03-31 302 views
22

考虑以下列表:如何从文本中提取所有表情符号?

a_list = [' me así, bla es se ds '] 

我怎样才能在新的列表中的所有表情符号,里面a_list提取:

new_lis = ['  '] 

我试图用正则表达式,但我没有所有可能的表情符号编码。

+0

链接在http://stackoverflow.com/q/26568722/674039和http://stackoverflow.com/q/35404144/674039 – wim

回答

29

您可以使用emoji库。您可以通过检查是否包含在emoji.UNICODE_EMOJI中来检查单个代码点是否是表情符号代码点。

import emoji 

def extract_emojis(str): 
    return ''.join(c for c in str if c in emoji.UNICODE_EMOJI) 
+0

您可以在**#EmojiCodeSheet ** [这里](https://github.com/shanraisshan/EmojiCodeSheet)下载字符串/ int格式的emoji列表,以便使用自定义比较器。 – shanraisshan

-2

所有Unicode表情符号及其各自的编码点均为here。它们是1F600到1F64F,所以你可以用一个类似范围的迭代器来构建它们。

+1

这只是一个表情符号特定范围。还有更多。 – user2357112

3

如果你不想使用外部库,你可以简单地使用正则表达式和re.findall()以适当的正则表达式一个Python化的方式找到emojies:

In [74]: import re 
In [75]: re.findall(r'[^\w\s,]', a_list[0]) 
Out[75]: ['', '', '', '', '', ''] 

正则表达式r'[^\w\s,]'是否定字符类,它匹配任何不是单词字符,空格或逗号的字符。

正如我在评论中提到的,文本通常包含单词字符和标点符号,通过这种方法很容易处理,对于其他情况,您可以将它们手动添加到字符类中。请注意,由于您可以在字符类中指定一系列字符,所以您甚至可以使它更短且更灵活。

另一种解决方案是使用接受表情符号的字符类([]而不是^)排除非表情符号的否定字符类。由于有很多emojis with different unicode values,您只需要将范围添加到角色类。如果你想匹配更多的emojies这里是一个很好的参考包含所有标准的emojies与各自的范围为不同的emojies http://apps.timwhitlock.info/emoji/tables/unicode

+0

适用于此特定输入,但有许多其他非表情符号字符不属于'\ w','\ s'或逗号类别。 – user2357112

+0

@ user2357112文本通常包含单词字符和标点符号,通过这种方法很容易处理,对于其他情况,您可以手动将它们添加到字符类中。请注意,由于您可以在字符类中指定一系列字符你甚至可以使它更短,更灵活。 – Kasramvd

+1

您的正则表达式在所有非逗号标点符号中失败,除此之外。 – user2357112

1

最高评分的答案并不总是工作。例如,标志emojis将不会被找到。考虑字符串:

s = u'Hello \U0001f1f7\U0001f1fa hello' 

什么会更好地工作是

import emoji 
emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys()) 
r = re.compile('|'.join(re.escape(p) for p in emojis_list)) 
print(' '.join(r.findall(s))) 
0

得到什么风滚草问的解决方案,是最精彩的答案,user594836的答案之间的混合。这是Python 3.6中适用于我的代码。

import emoji 
import re 

a_list=[' me así,bla es,se ds '] 

## Create the function to extract the emojis 
def extract_emojis(str): 
    emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys()) 
    r = re.compile('|'.join(re.escape(p) for p in emojis_list)) 
    aux=[' '.join(r.findall(s)) for s in a_list] 
    return(aux) 

## Execute the function 
extract_emojis(s) 

## the output 
['  '] 
相关问题