具有前后模式的列表的Grep

时间:2018-03-06 12:03:23

标签: r grep pattern-matching gsub

我有一个单词列表,我想在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。

谢谢。

2 个答案:

答案 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"         ""          

请参阅R demo online

正则表达式是

(?<![[:alpha:]])(?:TIP|HERO|good)(?![[:alpha:]])

请参阅online regex demo。细节:

  • (?<![[:alpha:]]) - (负面的背后)当前位置左侧不允许任何字母
  • (?:TIP|HERO|good) - 匹配3个替代方案中的任何一个
  • (?![[:alpha:]]) - (负向前瞻)当前位置右侧不允许任何字母。