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

问题描述 投票:0回答:1

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

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

r regex emoji utf-16
1个回答
7
投票

我将编码转换为 UTF-8,以将表情符号值的 UTF-8 值与

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

第一种方法:

library(stringr)
xvect = c('😂', 'no', '🍹', '😀', 'no', '😛')

Encoding(xvect) <- "UTF-8"

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

这里 1、3、4 和 6 是本例中 emoji 的字符。

已编辑:

第二种方法: 安装名为

remoji
的 GitHub 包。因为我们已经将表情符号项目转换为 UTF-8。我们现在可以比较表情符号库中所有表情符号的 UTF-8 值。使用
trimws
删除空格

library(remoji) # remotes::install_github("richfitz/remoji")
emj <- emoji(list_emoji(), TRUE)
which(xvect %in% trimws(emj))
# [1] 1 3 4 6

上述两种方法都不是完全证明,第一种方法假设向量中不存在除表情符号之外的任何ascii字符第二种方法依赖于

remoji
的库信息。如果库中不存在某个表情符号信息,则最后一个命令可能会产生 FALSE 而不是 TRUE

最终编辑:

根据 OP(@MichaelChirico) 和 @SymbolixAU 之间的讨论。感谢他们俩,这似乎是大写 U 的小拼写错误的问题。新的正则表达式是

xvect[grepl('[\U{1F300}-\U{1F6FF}]', xvect)]
。字符类的范围从 F300 到 F6FF。当然,如果表情符号位于该范围之外,则可以将该范围更改为新范围。这可能不是完整的列表,并且随着时间的推移,这些范围可能会不断增加/变化。

© www.soinside.com 2019 - 2024. All rights reserved.