【问题标题】:regular expression excluding word in R正则表达式排除 R 中的单词
【发布时间】:2015-01-16 14:41:09
【问题描述】:

我真的不知道如何在 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")

我想找到所有有“冰雹”但没有“海洋”的 obs

我的尝试:

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

-> 我只有 5 个:

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

我不知道其他 4 个会发生什么

【问题讨论】:

  • x[grepl("hail", x) & !grepl("marine", x)] 可能更直观
  • 你是最棒的,理查德。非常直观

标签: regex r


【解决方案1】:

使用环视断言。

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

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

> x[grep("^(?=.*\\bhail\\b)(?!.*\\bmarine\\b)", x, perl=TRUE)]
  • ^ 断言我们处于起步阶段。

  • (?=.*hail)肯定的前瞻,它断言匹配必须包含字符串hail

  • (?!.*marine) 否定前瞻,断言匹配不包含字符串 marine

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

【讨论】:

  • 这很棒。非常感谢你。我想给你一个大拇指,但我没有资格这样做。
【解决方案2】:

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

[^(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"

【讨论】:

  • 您必须擅长正则表达式,以免从手机接听而无法测试结果。
【解决方案3】:

如果所有x只包含hail的类型,那么:

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

应该可以正常工作。

编辑:根据 G. Grothendieck 的建议:

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

是一个更好的解决方案。

【讨论】:

  • 只有在至少有一个带有“marine”的组件时才有效。请改用x[ ! grepl("marine", x) ]
  • 由于示例数据中有"marine",所以我理所当然地认为它会在那里,但你是对的。我的答案已编辑。谢谢。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 2019-04-30
    • 2013-02-28
    • 2021-04-20
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2011-01-05
    相关资源
    最近更新 更多