排除R中单词的正则表达式
regular expression excluding word in 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")
我想找到所有具有 "hail" 但不具有 "marine"
的 obs
我的尝试:
x[grep("[^(marine)] hail", x)]
-> 我只有 5 个:
"small hail" "wind hail" "deep hail" "tstm wind hail" "gusty wind hail"
我不知道其他 4 个怎么样了
使用环视断言。
> 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
.
所以只有当两个条件都满足时,上面的正则表达式才会匹配起始锚点或行的开头。
您想在这种情况下使用先行断言。您的否定字符 class 的当前实现没有达到您的期望,而是匹配以下内容:
[^(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"
如果所有x
只包含hail
的类型,那么:
x[-grep("marine", x)]
应该可以正常工作。
编辑: 根据 G. Grothendieck 的建议:
x[ ! grepl("marine", x) ]
是更好的解决方案。
您的尝试 x[grep("[^(marine)] hail", x)]
是在寻找 hail
之前除 m,a,r,i,n,e 之外的任何字符。对于那些被排除在外的单词,hail
之前的单词的最后一个字母是这六个字母之一。
我真的不知道如何在 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")
我想找到所有具有 "hail" 但不具有 "marine"
的 obs我的尝试:
x[grep("[^(marine)] hail", x)]
-> 我只有 5 个:
"small hail" "wind hail" "deep hail" "tstm wind hail" "gusty wind hail"
我不知道其他 4 个怎么样了
使用环视断言。
> 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
.所以只有当两个条件都满足时,上面的正则表达式才会匹配起始锚点或行的开头。
您想在这种情况下使用先行断言。您的否定字符 class 的当前实现没有达到您的期望,而是匹配以下内容:
[^(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"
如果所有x
只包含hail
的类型,那么:
x[-grep("marine", x)]
应该可以正常工作。
编辑: 根据 G. Grothendieck 的建议:
x[ ! grepl("marine", x) ]
是更好的解决方案。
您的尝试 x[grep("[^(marine)] hail", x)]
是在寻找 hail
之前除 m,a,r,i,n,e 之外的任何字符。对于那些被排除在外的单词,hail
之前的单词的最后一个字母是这六个字母之一。