2017-04-12 88 views
5

我想確定我的矢量的元素包含的表情符號:如何將表情符號與R正則表達式匹配?

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

相關職位只包括其他語言,因爲他們大多是指專業圖書館,我無法想出一個辦法來轉換爲R:

第二個看起來非常有前途的,但很可惜(不提供perl = TRUE固定):

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

Error: invalid \u{xxxx} sequence (line 1)

類似的問題與其他問題來的。我們如何在R中匹配表情符號?

+6

資本U? (3去) – SymbolixAU

+0

@SymbolixAU哦,我的!那麼這是令人尷尬的orz – MichaelChirico

+0

你還想要縮小範圍來捕捉'飲料'表情符號:) – SymbolixAU

回答

2

我的編碼轉換爲UTF-8的表情符號價值的UTF-8值與remoji庫,它是UTF-8的所有表情符號的值進行比較。我正在使用stringr庫來查找矢量中表情符號的位置。一個可以自由使用grep或任何其他功能。

第1種方法:

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的表情符號在這種情況下字符。

編輯:

第2種方法: 安裝使用使用以下命令devtools叫remoji包,因爲我們已經轉換表情符號物品進入UTF -8。我們現在可以比較表情符號庫中存在的所有表情符號的UTF- 值。使用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

這是一個很好的建議,但在我的矢量中有非_many_非ASCII字符,它們不是表情符號。我更新了我的帖子以反映這一點。 – MichaelChirico

+0

@MichaelChirico是的我知道上述兩種方法都有一定的侷限性,我也試圖找出在R.Strange中是否有更好的選擇,即使在添加了新的字符後,上述兩個命令都給出了正確的結果。我不知道爲什麼 – PKumar

+1

評論中的錯字糾正和擴展版本似乎做得相當不錯:'x [grepl('[\ u {1F300} - \ u {1F6FF}]',x)]' – MichaelChirico