【发布时间】:2019-04-01 15:07:22
【问题描述】:
我正在 R 中建立一个新项目,并想从文本中提取特定符号
X <- c("amazing tiny phone ^_^","so cute!!! <3")
我想从R中的X中提取^_^和<3
谢谢!
【问题讨论】:
我正在 R 中建立一个新项目,并想从文本中提取特定符号
X <- c("amazing tiny phone ^_^","so cute!!! <3")
我想从R中的X中提取^_^和<3
谢谢!
【问题讨论】:
更直接
X = c("amazing tiny phone ^_^","so cute!!! <3","^_^ and :) are my fav symbols")
patt=c("=d" ,"<3" , ":o" , ":(" ,
":)" , "(y)" , ":*" , "^_^", ":d" ,";)" , ":'(")
variable = sapply(X,function(x){
i = which(patt%in%strsplit(x," ")[[1]])
if (length(i)>0){
paste(patt[i],collapse=" ")
} else{NA}
})
names(variable)=NULL
> variable
[1] "^_^" "<3" ":) ^_^" NA
【讨论】:
@GraemeForst 可以使用分组和前瞻来实现泛化:
group <- "[\\^\\_\\<\\>3\\:\\(\\)\\;]"
pat <- sprintf(".*[\\s\\b](%s+)(?!\\1)", group)
group 定义字符分组。基本上我们想要提取的所有符号。pat 定义了我们的匹配模式。 [\\s\\b] 表示在可能的匹配之前必须有空白或边界。 (?!\\1) 说在比赛之后不能有 group 的元素。这是一个演示:
X <- c("amazing tiny phone ^_^","so cute!!! <3", "I like pizza :)", "hello beautiful ;)")
gsub(pat, "\\1", grep(pat, X, value = TRUE, perl = TRUE), perl = TRUE)
# [1] "^_^" "<3" ":)" ";)"
这可以进一步细化和概括。可以添加一个非常简单的步骤是扩展grouping。
旧答案
您可以为此使用正则表达式:
# create the pattern to be extracted
pat = ".*(\\^\\_\\^).*|.*(\\<3).*" # escape special characters with "\\" and ".*" to specify there may be text before/after
# extract
gsub(pat, "\\1\\2", grep(pat, X, value = TRUE, perl = TRUE), perl = TRUE)
# [1] "^_^" "<3"
【讨论】:
"[a-zA-Z]+" 之类的模式找到所有没有字母的“单词”