拆分字母序列,同时保留原始序列位置

Splitting sequence of letters, whilst retaining original sequence position

我需要将以下字母序列分成不同的块

SCDKSFNRGECSCDKSFNRGECSCDKSFNRGEC

我使用了以前用户提供的以下代码来实现我最初想要的,即在每个 C 之后拆分序列。

library(dplyr)

TestSequence <- "SCDKSFNRGECSCDKSFNRGECSCDKSFNRGEC"

Test <- strsplit(TestSequence, "(?<=[C])", perl = TRUE) %>% unlist 

df <- data.frame(Fragment = Test) %>%
  mutate("position" = cumsum(nchar(Test)))

这允许我在每个 C 之后拆分序列并保留它在序列中的位置,例如 C 在位置 2、11 等

现在我需要在不同的位置拆分相同的序列,我可以使用以下方法在 P、A、G 或 S 之后拆分:

Test2 <- strsplit(TestSequence, "(?<=[P,A,G,S])", perl = TRUE) %>% unlist

如果我希望它在给定字符之后拆分,这很好,但如果我尝试在字符(例如 D)之前拆分它,我似乎无法在片段中保留 D。我只能保留它,如果它在 D 之后拆分。

我已经尝试了所有我能想到的向后看或向前看的组合,以下每个 D 前后的剪辑都不是那么有用。

Test3 <- strsplit(TestSequence, "(?=[D])", perl = TRUE) %>% unlist

还有没有办法保留每个C在原始序列中的准确位置?

因此,如果我要在初始 K 之后拆分测试序列,我会得到一个 SCDK 片段,我能否有一个单独的列来告诉我 C 在原始序列中的位置。作为第二个示例,下一个片段将是 SFNRGECSCDK 并且在该单独的列中它会说 C 最初位于位置 11。

Zero-length 因使用 strsplit 中使用的仅前瞻模式而导致的匹配未得到正确处理。

在这种情况下,您还需要“锚定”左侧的匹配项。使用 non-word 边界,或不允许在字符串开头匹配的后视:

TestSequence <- "SCDKSFNRGECSCDKSFNRGECSCDKSFNRGEC"
strsplit(TestSequence, "\B(?=D)", perl = TRUE)
# => [[1]]
# => [1] "SC"          "DKSFNRGECSC" "DKSFNRGECSC" "DKSFNRGEC"  
 
strsplit(TestSequence, "(?<!^)(?=D)", perl = TRUE)
# => [[1]]
# => [1] "SC"          "DKSFNRGECSC" "DKSFNRGECSC" "DKSFNRGEC"  

参见online R demo

\B(?=D) 模式匹配前面紧跟单词 char 且紧跟 D.

的位置

(?<!^)(?=D) 模式匹配的位置不是紧跟在字符串位置的开头(即不在字符串的开头),而是紧跟在 D.

另外,请注意 [P,A,G,S] 匹配 PAGS 和逗号 .您应该使用 [PAGS] 来匹配其中一个字母。