正则表达式排除R中的单词

时间:2015-01-16 14:41:10

标签: regex r

我真的不知道如何在R

中使用不匹配的正则表达式正确查找单词

例如:数据包括:

x =  c("hail", "small hail", "wind hail",  "deep hail",  "thunderstorm hail", "tstm wind hail", "gusty wind hail", "late season hail", "non severe hail", "marine hail")

我想要找到所有的人,并且#34;冰雹"但没有" marine"

我的尝试:

x[grep("[^(marine)] hail", x)]

- >我只有5:

"small hail"      "wind hail"       "deep hail"       "tstm wind hail"  "gusty wind hail"

我不知道其他4

会发生什么

4 个答案:

答案 0 :(得分:15)

使用外观断言。

> x =  c("hail", "small hail", "wind hail",  "deep hail",  "thunderstorm hail", "tstm wind hail", "gusty wind hail", "late season hail", "non severe hail", "marine hail")
> x[grep("^(?=.*hail)(?!.*marine)", x, perl=TRUE)]
[1] "hail"              "small hail"        "wind hail"        
[4] "deep hail"         "thunderstorm hail" "tstm wind hail"   
[7] "gusty wind hail"   "late season hail"  "non severe hail" 

OR

如有必要,添加\b边界。 \b匹配单词字符和非单词字符。

> x[grep("^(?=.*\\bhail\\b)(?!.*\\bmarine\\b)", x, perl=TRUE)]
  • ^断言我们刚开始。

  • (?=.*hail)确定匹配必须包含字符串hail

  • 的正向前瞻
  • (?!.*marine)否定前瞻声明匹配不会包含字符串marine

  • 因此,只有满足两个条件时,上述正则表达式才会匹配起始锚点或行首。

答案 1 :(得分:7)

你想在这种情况下使用先行断言。您的否定字符类的当前实现不符合您的预期,而是匹配以下内容:

[^(marine)]  # any character except: '(', 'm', 'a', 'r', 'i', 'n', 'e', ')'
 hail        # ' hail'

要解决此问题,您可以执行以下操作:

> x[grep('^(?!.*marine).*hail', x, perl=TRUE)]
# [1] "hail"              "small hail"        "wind hail"        
# [4] "deep hail"         "thunderstorm hail" "tstm wind hail"   
# [7] "gusty wind hail"   "late season hail"  "non severe hail"

答案 2 :(得分:5)

如果所有x仅包含hail类型,则:

x[-grep("marine", x)] 

应该工作得很好。

编辑:根据G.格洛腾迪克的建议:

 x[ ! grepl("marine", x) ] 

是一个更好的解决方案。

答案 3 :(得分:1)

您的尝试x[grep("[^(marine)] hail", x)]的作用是查找hail前面除m,a,r,i,n,e之外的任何字符。对于那些被排除在外的人,hail之前的单词的最后一个字母是这六个中的一个。