我有一个单词列表,我想在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。
谢谢。
答案 0 :(得分:0)
也许你应该分两步完成:
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
有关[:alpha:]
的说明,请参阅https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html答案 1 :(得分:0)
查找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:]])
- (负向前瞻)当前位置右侧不允许任何字母。