在R中使用str_detect()检测完全匹配的情况

问题描述 投票:0回答:1

我在R中有一个字符串。

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

我想保留所有有FLT1的火柴,但当其他火柴出现时,我不想保留。字母数字 字符被添加。 换句话说,我想保留所有的条目,除了第二个,因为所有的条目都提到了FLT1,但是第二个条目提到了FLT1P1。

当我使用str_detect时,它将所有的条目都返回为真。

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

谁能告诉我最好的方法,只返回提到FLT1的条目?

r stringr
1个回答
3
投票

可能是 词境 \\b 都可以使用。它们可以匹配字符串的开头或结尾,以及任何不是数字、字母或下划线的字符的转换。

str_detect(string, "\\bFLT1\\b")
[1]  TRUE FALSE  TRUE  TRUE

1
投票

使用包围符

library(stringr)

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

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

创建于2020-06-17 重读包 (v0.3.0)


1
投票

"没有添加其他字符 "对我来说是指字的边界,它的表达方式是 \\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
投票

最好的方法是用 \\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 如果,而且只有当紧接着的事情是字符串的结尾($)或 -,. 这意味着,当紧接着的字符是字母数字时,它不匹配,例如,字母数字。

或者,如果你想排除添加字母数字字符的值,你可以使用 负面 瞻前顾后。

grep("FLT1(?!\\w)", x, perl = T, value = T)
[1] "FLT1"          "FLT1-FLT2"     "SGY-FLT1, GPD"
© www.soinside.com 2019 - 2024. All rights reserved.