如何提取与精确字符串匹配但隐藏在较大字符串中的行?

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

我需要过滤掉数据框中包含这个确切字符串“S[Phospho(STY)]Q”的行。但是,在每种情况下,该字符串都位于较大字符串的中间,从不在开头,也从不在结尾。

我遇到的问题是在下面的列表中我希望我的代码提取 QGS[Phospho(STY)]QAG 和 GS[Phospho(STY)]QP 但 str_detect 函数只提取那些行字符串中包含仅部分匹配的其他字母,例如 SSQGS[Phospho(STY)]DDEQ.

我尝试添加S[磷酸(STY)]Q,但没有过滤任何内容

有什么建议吗?谢谢!

可重现的示例:

`col <- c("QGS[Phospho(STY)]QAG",
    "GS[Phospho(STY)]QP",
    "SSQGS[Phospho(STY)]DDEQ",
    "SSQGS[Phospho(STY)]DDEQI",
    "S[Phospho(STY)]TSSQPE")

dat <- data.frame(col)

STQ_dat <- dat %>%  
  filter(str_detect(col, "S[phospho(STY)]Q"))

STQ_dat`
r dplyr stringr
1个回答
0
投票

首先,您必须考虑要查找的字母的正确大小写,即使用

P
而不是
p
。其次,默认情况下,提供给
pattern=
str_detect
被解释为正则表达式,并且
[
]
(以及
(
)
)都是正则表达式中的特殊字符,即您有使用
\\
来逃避它们,即
\\[
来寻找
[
。您使用
[]
的方式指定了一组有效符号,例如包含
SSQ
的字符串将与您的模式匹配,因为中间的
S
与指定集合中的字母匹配。避免转义的第二个选择是将模式包装在
fixed()
:

library(stringr)
library(dplyr, warn = FALSE)

dat %>%
  filter(
    str_detect(col, "S\\[Phospho\\(STY\\)\\]Q")
  )
#>                    col
#> 1 QGS[Phospho(STY)]QAG
#> 2   GS[Phospho(STY)]QP

dat %>%
  filter(
    str_detect(col, fixed("S[Phospho(STY)]Q"))
  )
#>                    col
#> 1 QGS[Phospho(STY)]QAG
#> 2   GS[Phospho(STY)]QP
© www.soinside.com 2019 - 2024. All rights reserved.