Обнаружение точных совпадений с использованием str_detect () в R - PullRequest
1 голос
/ 17 июня 2020

У меня есть строка в R:

c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")

Я хочу сохранить все совпадения с FLT1, но не при добавлении других буквенно-цифровых c символов. Другими словами, я хочу сохранить все записи, кроме второй, поскольку все они упоминают FLT1, но вторая упоминает FLT1P1.

Когда я использую str_detect, он возвращает все как истину:

str_detect(string, "FLT1")
[1] TRUE TRUE TRUE TRUE

Может ли кто-нибудь посоветовать лучший способ вернуть только те предметы, которые упоминают FLT1?

Ответы [ 4 ]

3 голосов
/ 17 июня 2020

Вероятно, границы слов с \\b будут работать. Они соответствуют началу или концу строк и переходу к / от любого символа, кроме числа, буквы или подчеркивания.

str_detect(string, "\\bFLT1\\b")
[1]  TRUE FALSE  TRUE  TRUE
1 голос
/ 17 июня 2020

Лучший способ - использовать \\b, как отметили другие. В качестве альтернативы вы можете использовать положительный просмотр вперед:

Данные:

x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")

Решение:

grep("FLT1(?=$|-|,)", x, perl = T, value = T)
[1] "FLT1"          "FLT1-FLT2"     "SGY-FLT1, GPD"

Здесь grep соответствует FLT1 if , и только в том случае, если сразу следующим будет либо конец строки ($), либо -, либо ,. Подразумевается, что он не совпадает, если следующий сразу за символом является, например, буквенно-цифровыми c.

Или, если вы хотите исключить значения, в которые добавлены буквенно-цифровые c символы, вы можно использовать отрицательное опережающее:

grep("FLT1(?!\\w)", x, perl = T, value = T)
[1] "FLT1"          "FLT1-FLT2"     "SGY-FLT1, GPD"
1 голос
/ 17 июня 2020

«Никакие другие символы не добавлены» означает для меня границу слова, которая выражается \\b.

x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")
stringr::str_detect(x, "FLT1\\b")
# [1]  TRUE FALSE  TRUE  TRUE

или основание R:

grepl("FLT1\\b", x)
# [1]  TRUE FALSE  TRUE  TRUE
1 голос
/ 17 июня 2020

Используйте осмотритесь

library(stringr)

x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD","AFLT1")

x %>% 
  str_detect("(?<![:alpha:])FLT1(?![:alpha:])")
#> [1]  TRUE FALSE  TRUE  TRUE FALSE

Создано 17.06.2020 с помощью пакета (v0.3.0)

...