我有一个单词列表,我想在tbl_df中替换。
这是数据。
data<-tbl_df(c("05+12+TIP", "eintippen", "MyTipStar", "05TIP", "TIP","05+12+HERO", "einhero", "MyHEROStar", "05HERO", "HERO"))
这是我要查找的模式。
pat<-c("TIP", "HERO", "good")
这将与该代码一起使用,从而导致以下结果:
data$value <-gsub(paste(pat, collapse="|", ignore.case== TRUE), "", data$value )
[1] "05+12+" "eintippen" "MyTipStar" "05" "" "05+12+" "einhero" "MyStar" "05" ""
我想查找pat的所有条目,但前后不能是字母。
[1] "05+12+" "eintippen" "MyTipStar" "05" "" "05+12+" "ein" "MyHEROStar" "05" ""
所以我找不到“ eintippen”,因为该笔尖留下了n,右边是p。
也许您应该分两个步骤进行:
data <- c("05+12+TIP", "eintippen", "MyTipStar", "05TIP", "TIP","05+12+HERO", "einhero", "MyHEROStar", "05HERO", "HERO")
pat <- c("TIP", "HERO", "good")
mask <- grepl(paste0("([^[:alpha:]]|^)(",paste(pat, collapse="|"), ")([^[:alpha:]]|$)"), data, ignore.case= TRUE)
data[mask] = gsub(paste(pat, collapse="|"), ignore.case= TRUE, "", data[mask])
data
请参见https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html以了解[:alpha:]
查找pat的所有条目,但前后不能是字母
您需要使用带有环顾四周的PCRE正则表达式(否则,当您使用捕获组方法时,将无法处理连续的匹配项,如果有的话:]
value <- c("05+12+TIP", "eintippen", "MyTipStar", "05TIP", "TIP","05+12+HERO", "einhero", "MyHEROStar", "05HERO", "HERO")
data <- data.frame(value)
pat<-c("TIP", "HERO", "good")
regex = paste0("(?<![[:alpha:]])(?:", paste(pat, collapse="|"), ")(?![[:alpha:]])")
regex
gsub(regex, "", data$value, perl=TRUE, ignore.case=TRUE )
## [1] "05+12+" "eintippen" "MyTipStar" "05" ""
## [6] "05+12+" "einhero" "MyHEROStar" "05" ""
正则表达式为
(?<![[:alpha:]])(?:TIP|HERO|good)(?![[:alpha:]])
请参见online regex demo。其详细信息:
(?<![[:alpha:]])
-(后面为负号)当前位置的左侧不允许有字母(?:TIP|HERO|good)
-匹配3个选择中的任何一个](?![[:alpha:]])
-(负号),在当前位置的右边不允许有字母。