根据正则表达式替换数据框列

我试图使用正则表达式提取数据框中的部分列.我遇到的问题包括grep返回整个值的事实,而不仅仅是匹配的部分,并且str_extract似乎不能以矢量化方式工作.

这是我正在尝试的.我想df $match来显示alpha.alpha.模式存在的地方,否则NA.如何只显示匹配的部分?

另外,我如何在R正则表达式中替换[a-zA-Z]?我可以使用像[:alpha:]这样的字符类或POSIX代码吗?

v1 <- c(1:4)
v2 <- c("_a.b._",NA,"_C.D._","_ef_")
df <- data.frame(v1,v2,stringsAsFactors = FALSE)

df$match <- grepl("[a-zA-Z]\\.[a-zA-Z]\\.",df$v2)
df$match

#TRUE FALSE  TRUE FALSE

v2grep <- grep("[a-zA-Z]\\.[a-zA-Z]\\.",df$v2,value = TRUE)

df$match[df$match == TRUE] <- v2grep
df$match[df$match == FALSE] <- NA

df

#v1  v2      match
#1   _a.b._  _a.b._
#2   <NA>    <NA>
#3   _C.D._  _C.D._
#4   _ef_    <NA>

我想要的是:

#v1  v2      match
#1   _a.b._  a.b.
#2   <NA>    <NA>
#3   _C.D._  C.D.
#4   _ef_    <NA>

解决方法

4方法……

这里有2个基本方法,以及我维护的qdapRegex包和stringi包中的rm_default(extract = TRUE).

unlist(sapply(regmatches(df[["v2"]],gregexpr("[a-zA-Z]\\.[a-zA-Z]\\.",df[["v2"]])),function(x){
        ifelse(identical(character(0),x),x)
    })
)

## [1] "a.b." NA     "C.D." NA 

pat <- "(.*?)([a-zA-Z]\\.[a-zA-Z]\\.)(.*?)$"
df[["v2"]][!grepl(pat,df[["v2"]])] <- NA
df[["v2"]] <- gsub(pat,"\\2",df[["v2"]])

## [1] "a.b." NA     "C.D." NA

library(qdapRegex)
unlist(rm_default(df[["v2"]],pattern = "[a-zA-Z]\\.[a-zA-Z]\\.",extract = TRUE))

## [1] "a.b." NA     "C.D." NA 

library(stringi)
stri_extract_first_regex(df[["v2"]],"[a-zA-Z]\\.[a-zA-Z]\\.")

## [1] "a.b." NA     "C.D." NA

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...