GREP:在字符串列表中找到2个单词共存的位置

时间:2015-10-29 15:03:28

标签: r grep

鉴于以下列表:

list <- c("Horse Cat - Dog - Snake/Cow", "Monkey  Chicken - Horse - Donkey/Cow", "Fish Rat - Tortoise - Worm/Bird", "Bat Lizard - Ox - Snake/Cow",
          "Dog Cat - Horse - Snake/Cow")

找到马和牛都存在于同一个字符串中的位置的最佳方法是什么?

尝试:grepl("Horse & Cow", list)给了我:[1] FALSE FALSE FALSE FALSE FALSE

如何编写返回[1] TRUE TRUE FALSE FALSE TRUE

的grep语句

4 个答案:

答案 0 :(得分:3)

您可以尝试使用正则表达式实现此功能,这似乎可行

grepl("Horse.*?Cow|Cow.*?Horse", list)
## [1]  TRUE  TRUE FALSE FALSE  TRUE

如果您想忽略案例,可以添加ignore.case = TRUE

顺便说一句,如果你想要这些地点,最好使用grep而不是

grep("Horse.*?Cow|Cow.*?Horse", list)
## [1] 1 2 5

答案 1 :(得分:3)

最简单的方法就是使用两个grepl并与&

结合使用
R> grepl("Horse", list) & grepl("Cow", list)
[1]  TRUE  TRUE FALSE FALSE  TRUE

R> grepl("Horse", list)
[1]  TRUE  TRUE FALSE FALSE  TRUE
R> grepl("Cow", list)
[1]  TRUE  TRUE FALSE  TRUE  TRUE

或者,您可以使用单个grepl命令:

grepl("Cow.*Horse|Horse.*Cow", list)

答案 2 :(得分:1)

要返回逻辑向量,您可以使用:

grepl("Horse", list) & grepl("Cow", list)

要返回索引,请将上述语句包装在which()

答案 3 :(得分:1)

另一种可能性:

grepl("^(?=.*\\bHorse\\b)(?=.*\\bCow\\b)", list, perl=TRUE) 
## [1]  TRUE  TRUE FALSE FALSE  TRUE

虽然:

grepl("^(?=.*\\bhorse\\b)(?=.*\\bcow\\b)", list, ignore.case=TRUE, perl=TRUE) 
案件可能有所不同,

可能更有用。