如何将表情符号与R正则表达式相匹配?

时间:2017-04-12 02:12:40

标签: r regex emoji utf-16

我想确定我的载体中哪些元素包含表情符号:

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中匹配表情符号?

1 个答案:

答案 0 :(得分:4)

我正在将编码转换为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是表情符号的字符。

已编辑:

第二种方法: 使用devtools使用以下命令安装名为remoji的包,因为我们已经将表情符号项转换为 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字符第二种方法依赖于{{的库信息1}}。如果库中不存在某个表情符号信息,则最后一个命令可能产生FALSE而不是TRUE

最终修改:

根据OP( @MichaelChirico )和 @SymbolixAU 之间的讨论。感谢他们两个似乎是资本U的小错字的问题。新的正则表达式是remoji。字符类中的范围取自F300到F6FF。如果表情符号位于此范围之外,则可以将此范围更改为新范围。这可能不是完整的列表,并且在一段时间内这些范围可能会不断增加/变化。