我在R中有一个字符串。
c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")
我想保留所有有FLT1的火柴,但当其他火柴出现时,我不想保留。字母数字 字符被添加。 换句话说,我想保留所有的条目,除了第二个,因为所有的条目都提到了FLT1,但是第二个条目提到了FLT1P1。
当我使用str_detect时,它将所有的条目都返回为真。
str_detect(string, "FLT1")
[1] TRUE TRUE TRUE TRUE
谁能告诉我最好的方法,只返回提到FLT1的条目?
可能是 词境 \\b
都可以使用。它们可以匹配字符串的开头或结尾,以及任何不是数字、字母或下划线的字符的转换。
str_detect(string, "\\bFLT1\\b")
[1] TRUE FALSE TRUE TRUE
使用包围符
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)
"没有添加其他字符 "对我来说是指字的边界,它的表达方式是 \\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
最好的方法是用 \\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"