如何将表情符号与 R 正则表达式匹配?
How can I match emoji with an R regex?
我想确定向量中的哪些元素包含表情符号:
x = c('', 'no', '', '', 'no', '', '䨺', '감사')
x
# [1] "\U0001f602" "no" "\U0001f379" "\U0001f600" "no" "\U0001f61b" "䨺" "감사"
相关帖子只涵盖其他语言,因为它们大多指的是专门的库,所以我想不出一种翻译成 R 的方法:
- What is the regex to extract all the emojis from a string?
- How do I remove emoji from string
- replace emoji unicode symbol using regexp in javascript
- Regular expression matching emoji in Mac OS X / iOS
- remove unicode emoji using re in python
第二个看起来很有前途,但可惜(无法通过提供 perl = TRUE
解决):
x[grepl('[\u{1F600}-\u{1F6FF}]', x)]
Error: invalid \u{xxxx} sequence (line 1)
类似的问题来自其他问题。我们如何在 R 中匹配表情符号?
我正在将编码转换为 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是本例中的emoji字符。
已编辑:
第二种方法:
使用以下命令使用 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 字符,第二种方法依赖于关于 remoji
的图书馆信息。如果某个表情符号信息不存在于库中,最后一个命令可能会产生 FALSE 而不是 TRUE。
最终编辑:
根据 OP(@MichaelChirico) 和 @SymbolixAU 之间的讨论。多亏了他们两个,大写字母 U 的小错字似乎是个问题。新的正则表达式是 xvect[grepl('[\U{1F300}-\U{1F6FF}]', xvect)]
。字符class中的范围是从F300到F6FF。如果表情符号位于此范围之外,当然可以将此范围更改为新范围。这可能不是完整的列表,并且在一段时间内这些范围可能会保持 increasing/changing.
我想确定向量中的哪些元素包含表情符号:
x = c('', 'no', '', '', 'no', '', '䨺', '감사')
x
# [1] "\U0001f602" "no" "\U0001f379" "\U0001f600" "no" "\U0001f61b" "䨺" "감사"
相关帖子只涵盖其他语言,因为它们大多指的是专门的库,所以我想不出一种翻译成 R 的方法:
- What is the regex to extract all the emojis from a string?
- How do I remove emoji from string
- replace emoji unicode symbol using regexp in javascript
- Regular expression matching emoji in Mac OS X / iOS
- remove unicode emoji using re in python
第二个看起来很有前途,但可惜(无法通过提供 perl = TRUE
解决):
x[grepl('[\u{1F600}-\u{1F6FF}]', x)]
Error: invalid \u{xxxx} sequence (line 1)
类似的问题来自其他问题。我们如何在 R 中匹配表情符号?
我正在将编码转换为 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是本例中的emoji字符。
已编辑:
第二种方法:
使用以下命令使用 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 字符,第二种方法依赖于关于 remoji
的图书馆信息。如果某个表情符号信息不存在于库中,最后一个命令可能会产生 FALSE 而不是 TRUE。
最终编辑:
根据 OP(@MichaelChirico) 和 @SymbolixAU 之间的讨论。多亏了他们两个,大写字母 U 的小错字似乎是个问题。新的正则表达式是 xvect[grepl('[\U{1F300}-\U{1F6FF}]', xvect)]
。字符class中的范围是从F300到F6FF。如果表情符号位于此范围之外,当然可以将此范围更改为新范围。这可能不是完整的列表,并且在一段时间内这些范围可能会保持 increasing/changing.