在字符串中搜索unicode值

And*_*ews 3 unicode grep r gsub

我试图在由字符串组成的数据框中标识唯一的unicode值。我尝试使用grep函数,但是遇到以下错误

Error: '\U' used without hex digits in character string starting ""\U"
Run Code Online (Sandbox Code Playgroud)

数据框示例

                     time sender                                                    message
1     2012-12-04 13:40:00      1                                            Hello handsome!
2     2012-12-04 13:40:08      1                                                 \U0001f618
3     2012-12-04 14:39:24      1                                                 \U0001f603
4     2012-12-04 16:04:25      2                                            <image omitted>
73    2012-12-05 06:02:17      1 Haha not white and blue... White with blue eyes \U0001f61c
40619 2015-05-08 10:00:58      1                                       \U0001f631\U0001f637

grep("\U", dat$messages)
Run Code Online (Sandbox Code Playgroud)

数据

dat <- 
structure(list(time = c("2012-12-04 13:40:00", "2012-12-04 13:40:08", 
"2012-12-04 14:39:24", "2012-12-04 16:04:25", "2012-12-05 06:02:17", 
"2015-05-08 10:00:58"), sender = c(1L, 1L, 1L, 2L, 1L, 1L), message = c("Hello handsome!", 
"\U0001f618", "\U0001f603", "<image omitted>", "Haha not white and blue... White with blue eyes \U0001f61c", 
"\U0001f631\U0001f637")), .Names = c("time", "sender", "message"
), class = "data.frame", row.names = c("1", "2", "3", "4", "73", 
"40619"))
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 5

我假设“ unicode字符”是指非ASCII字符。字符编码根据编码可能具有不同的含义。R用特殊\U序列表示当前编码之外的值。请注意,斜杠和字母“ U”实际上都不会出现在实际数据中。当没有适当的字形时,这就是将它们转义以显示在屏幕上的方式。

例如,即使最后一条消息看起来很长,但实际上只有两个字符

dat$message[6]
# [1] "\U0001f631\U0001f637"
nchar(dat$message[6])
# [1] 2
Run Code Online (Sandbox Code Playgroud)

您可以很容易地使用正则表达式查找非ASCII代码。ASCII字符均具有代码0-128(或八进制的000至177)。您可以使用以下方法找到该范围之外的值

grep("[^\001-\177]", dat$message)
# [1] 2 3 5 6
Run Code Online (Sandbox Code Playgroud)

  • 要提取您要使用`gregexpr`而不是`grep`。例如:`m &lt;-gregexpr(“ [^ \ 001- \ 177]”,dat $ message); regmatches(dat $ message,m)` (2认同)

Ste*_*pré 5

尝试:

library(stringi)
stri_enc_isascii(dat$message)
Run Code Online (Sandbox Code Playgroud)

这使:

# [1]  TRUE FALSE FALSE  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)