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

Mic*_*ico 8 regex r utf-16 emoji

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

x = c('', 'no', '', '', 'no', '', '?', '??')
x
# [1] "\U0001f602" "no"         "\U0001f379" "\U0001f600" "no"         "\U0001f61b" "?"         "??"
Run Code Online (Sandbox Code Playgroud)

相关帖子只涵盖其他语言,因为大部分都是指专业图书馆,我无法想出一种翻译成R的方法:

第二个看起来很有希望,但唉(不是通过提供固定perl = TRUE):

x[grepl('[\u{1F600}-\u{1F6FF}]', x)]
Run Code Online (Sandbox Code Playgroud)

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

类似的问题来自其他问题.我们怎样才能匹配R中的表情符号?

PKu*_*mar 7

我将编码转换为 UTF-8,以将表情符号值的 UTF-8 值与库中 UTF-8 格式的所有表情符号值进行比较remoji。我正在使用该stringr库来查找表情符号在向量中的位置。可以自由使用 grep 或任何其他函数。

第一种方法:

library(stringr)
xvect = c('', 'no', '', '', 'no', '')

Encoding(xvect) <- "UTF-8"

which(str_detect(xvect,"[^[:ascii:]]")==T)
# [1] 1 3 4 6
Run Code Online (Sandbox Code Playgroud)

在本例中,1、3、4 和 6 是表情符号的字符。

编辑:

第二种方法:使用以下命令 安装名为 using 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)
Run Code Online (Sandbox Code Playgroud)

输出:

which(xvect %in% trimws(emo))
# [1] 1 3 4 6
Run Code Online (Sandbox Code Playgroud)

上述两种方法都不是完全证明,第一种方法假设向量中不存在除表情符号之外的任何 ascii 字符第二种方法依赖于 的库信息remoji。如果库中不存在某个表情符号信息,则最后一个命令可能会产生 FALSE 而不是 TRUE

最终编辑:

根据 OP( @MichaelChirico ) 和@SymbolixAU之间的讨论。感谢他们俩,这似乎是大写 U 的小拼写错误的问题。新的正则表达式是xvect[grepl('[\U{1F300}-\U{1F6FF}]', xvect)]。字符类的范围从 F300 到 F6FF。当然,如果表情符号位于该范围之外,则可以将该范围更改为新范围。这可能不是完整的列表,并且随着时间的推移,这些范围可能会不断增加/变化。