如何使用R正则表达式匹配表情符号?

10

我想确定我的向量中包含哪些表情符号:

x = c('', 'no', '', '', 'no', '', '䨺', '감사')
x
# [1] "\U0001f602" "no"         "\U0001f379" "\U0001f600" "no"         "\U0001f61b" "䨺"         "감사"

相关帖子只涵盖其他语言,而且因为它们大多是指专业库,我无法想出一种将其翻译成R的方法:

第二个看起来非常有前途,但不幸的是(即使提供perl = TRUE也无法解决):

x[grepl('[\u{1F600}-\u{1F6FF}]', x)]

错误:无效的 \u{xxxx} 序列(第1行)

其他问题也会出现类似的情况。我们如何在R中匹配表情符号?


6
大写字母U?(还有3个) - SymbolixAU
@SymbolixAU 哦,我的天啊!那真是尷尬 orz - MichaelChirico
您还需要缩小范围以捕获“饮料”表情符号 :) - SymbolixAU
@SymbolixAU 我猜应该从1F347开始吧?这些表情符号之间的所有内容都在这里吗?http://unicode.org/emoji/charts/full-emoji-list.html - MichaelChirico
实际上,我可以看到一直到1F300(旋风)的所有内容。 - MichaelChirico
显示剩余2条评论
1个回答

6
我正在将编码转换为UTF-8,以便比较表情符号值的UTF-8值与remoji库中所有表情符号值的UTF-8值。我使用stringr库在向量中查找表情符号的位置。也可以使用grep或任何其他函数。 第一种方法:
library(stringr)
xvect = c('', 'no', '', '', 'no', '')

Encoding(xvect) <- "UTF-8"

which(str_detect(xvect,"[^[:ascii:]]")==T)
# [1] 1 3 4 6

这里的1、3、4和6是表情符号。
编辑后:
第二种方法:安装一个名为“remoji”的包,使用devtools命令,由于我们已经将表情项转换为UTF-8格式,现在可以比较表情库中所有表情的UTF-8值。 使用“trimws”命令去除空格。
install.packages("devtools")

devtools::install_github("richfitz/remoji")
library(remoji)
emj <- emoji(list_emoji(), TRUE)
xvect %in% trimws(emj)

输出:

which(xvect %in% trimws(emo))
# [1] 1 3 4 6

以上两种方法都不是完美的,第一种方法假设向量中除表情符号外没有任何ASCII字符,而第二种方法依赖于remoji库的信息。如果某个表情符号的信息不在库中,最后一个命令可能会返回FALSE而不是TRUE。
最终编辑:
根据OP(@MichaelChirico)和@SymbolixAU之间的讨论,感谢他们,似乎问题出在一个小写字母U的拼写错误上。新的正则表达式为xvect[grepl('[\U{1F300}-\U{1F6FF}]', xvect)]。字符类中的范围从F300到F6FF。当然,在表情符号位于此范围之外时,可以更改此范围以适应新的范围。这可能不是完整的列表,随着时间的推移,这些范围可能会不断增加/更改。

1
这是一个不错的建议,但我的向量中有很多非ASCII字符,并不是表情符号。我已经更新了我的帖子以反映这一点。 - MichaelChirico
@MichaelChirico 是的,我知道上述两种方法都有一些限制,我也在尝试寻找是否有更好的R替代方案。奇怪的是,即使在新字符添加后,上述两个命令仍然能够给出正确的结果。我不确定为什么。 - PKumar
1
评论中更正了拼写错误并扩展的版本似乎表现不错:x[grepl('[\U{1F300}-\u{1F6FF}]', x)] - MichaelChirico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接