将grep应用于具有前后格式的列表

问题描述 投票:0回答:2

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

r grep pattern-matching gsub
2个回答
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

请参见https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html以了解[:alpha:]


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:]])-(负号),在当前位置的右边不允许有字母。
© www.soinside.com 2019 - 2024. All rights reserved.