如何在 R 中使用 gsub 删除以字母开头的字符串?

How to remove strings that start with alphabet using gsub in R?

我收集了推文,我想从每条推文中提取表情符号 unicode。表情符号 unicode 是 <U+00001F44D> 格式,我在 R 上使用 gsub 函数使用函数

删除表情符号前后的所有文本
tweets$text <- gsub(".*(<.*>).*", "\1", tweets$text)

但是,因为每条推文可能有多个表情符号,所以我决定在字符“>”之后拆分每一列。

在某些列中,有些字符串只是字母字符而不以“<”开头。

我的问题是:如果字符串不是以“<”开头,我该如何删除它?

示例:

data$text <- c("<U+000>", "character", "abc <U+000>")

data$text <- gsub(".*(<.*>).*", "\1", data$text)

数据仍将包含 "character" 字符串,但我正在尝试删除除表情符号 unicode 之外的所有字符。

我们可以用grep代替gsub

grep("^\<", v1, invert = TRUE, value = TRUE)
#[1] "<U+000>"

如果我们需要提取表情符号并删除其余字符,我们可以使用 stringr 中的 str_extract。指定要匹配的正则表达式,即 < 是一个元字符,因此我们可以将其转义 (\<),后跟一个或多个不是 > 的字符(在方括号内将评估文字字符 - ^ - 表示不是该字符)后跟 >(再次转义 \

library(stringr)
str_extract(v1, "\<[^>]+\>")
#[1] "<U+000>" NA        "<U+000>"

如果有多个元素我们需要创建多个列

lst1  <- str_extract_all(dat$v2, "\<[^>]+\>")
n <- lengths(lst1) 
lapply(lst1, `length<-`,max(n)) 
dat[paste0("Col", seq_len(max(n)))] <- do.call(rbind,
       lapply(lst1, `length<-`,max(n)))

dat
#                          v2    Col1    Col2
#1                    <U+000> <U+000>    <NA>
#2                  character    <NA>    <NA>
#3                abc <U+000> <U+000>    <NA>
#4 <U+000> characters <U+000> <U+000> <U+000>

或使用base R

regmatches(v1, regexpr("\<[^>]+\>", v1, perl = TRUE))
#[1] "<U+000>" "<U+000>"

数据

v1 <- c("<U+000>", "character", "abc <U+000>")
v2 <- c(v1, "<U+000> characters <U+000>")
dat <- data.frame(v2 = v2, stringsAsFactors = FALSE)