如何提取 R 中特定字符集前后的所有字符,同时确保这些字符在字符串中为 first/last?
How to extract all characters before and after a certain set of characters in R while making sure those characters are first/last in the string?
我有一个长字符串:
my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"
我想从这个字符串中提取两件事:
- 在之前第一次遇到CAAAAG
的一切
- 一切“after” last 遇到 TGGGCATT
CAAAAG 之前的所有内容都可以这样找到:
stringr::word(my_string, 1, sep = "CAAAAG")
但是我如何确定字符串中的 "first" CAAAAG?而且我收到了在第一个 CAAAAG?
之前 找到的所有字符
TGGGCATT 也是如此。我可以通过这种方式收到所有 "after" TGGGCATT:
stringr::word(my_string, -1, sep = "TGGGCATT")
但是我如何确保我的字符串中的所有字符都来自 "after" LAST TGGGCATT?
我想我有两种方法,每种方法都用过。
my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"
library(stringr)
str_match_all(my_string, '(.*?)CAAAAG')
#[[1]]
# [,1]
#[1,] "GTCAGTCGATCTGGGCATTATGCGTCAAAAG"
#[2,] "GCTGCTAGCTAAAGCTGATCAGCATCAAAAG"
#[3,] #"GCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAG"
#[4,] "GTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAG"
# [,2]
#[1,] "GTCAGTCGATCTGGGCATTATGCGT"
#[2,] "GCTGCTAGCTAAAGCTGATCAGCAT"
#[3,] "GCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCA"
#[4,] "GTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCA"
first.match <- str_match_all(my_string, '(.*?)CAAAAG')[[1]][1,2]
first.match
#[1] "GTCAGTCGATCTGGGCATTATGCGT"
str_locate_all(my_string, 'TGGGCATT')
#[[1]]
# start end
#[1,] 12 19
#[2,] 106 113
#[3,] 175 182
second.match.index <- str_locate_all(my_string, 'TGGGCATT')[[1]]
second.match <- substr(my_string,second.match.index[nrow(second.match.index),ncol(second.match.index)]+1,
nchar(my_string))
second.match
#[1] "TACAGTCAGTCACAAAAGGTCAGTCAGTCA"
编辑:添加“+1”是因为您想要下一个索引,而不是搜索字符串结束的索引。
首先,检查出现次数:
gregexpr('CAAAAG', my_string)
[[1]]
[1] 26 57 134 194
attr(,"match.length")
[1] 6 6 6 6
attr(,"useBytes")
[1] TRUE
gregexpr('TGGGCATT', my_string)
[[1]]
[1] 12 106 175
attr(,"match.length")
[1] 8 8 8
attr(,"useBytes")
[1] TRUE
现在你可以仔细检查这对表达式 return 相同的字符:
# Before first occurence of CAAAAG
stringr::word(my_string, 1, sep = "CAAAAG")
substr(my_string, 0, 26 - 1) # 26 first occurrence
# After last occurrence of TGGGCATT
stringr::word(my_string, -1, sep = "TGGGCATT")
substr(my_string, 175 + 8, nchar(my_string)) # 175 last occurrence + lenght of 'TGGGCATT'
此外,您可以使用 sub
和基础包中的正则表达式获得相同的结果:
# Before first occurence of CAAAAG
sub('CAAAAG.*$', '', my_string)
[1] "GTCAGTCGATCTGGGCATTATGCGT"
# After last occurrence of TGGGCATT
sub('.*TGGGCATT', '\1', my_string)
[1] "ACAGTCAGTCACAAAAGGTCAGTCAGTCA"
我有一个长字符串:
my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"
我想从这个字符串中提取两件事:
- 在之前第一次遇到CAAAAG 的一切
- 一切“after” last 遇到 TGGGCATT
CAAAAG 之前的所有内容都可以这样找到:
stringr::word(my_string, 1, sep = "CAAAAG")
但是我如何确定字符串中的 "first" CAAAAG?而且我收到了在第一个 CAAAAG?
之前 找到的所有字符TGGGCATT 也是如此。我可以通过这种方式收到所有 "after" TGGGCATT:
stringr::word(my_string, -1, sep = "TGGGCATT")
但是我如何确保我的字符串中的所有字符都来自 "after" LAST TGGGCATT?
我想我有两种方法,每种方法都用过。
my_string = "GTCAGTCGATCTGGGCATTATGCGTCAAAAGGCTGCTAGCTAAAGCTGATCAGCATCAAAAGGCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAGGTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAGGTCAGTCAGTCA"
library(stringr)
str_match_all(my_string, '(.*?)CAAAAG')
#[[1]]
# [,1]
#[1,] "GTCAGTCGATCTGGGCATTATGCGTCAAAAG"
#[2,] "GCTGCTAGCTAAAGCTGATCAGCATCAAAAG"
#[3,] #"GCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCACAAAAG"
#[4,] "GTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCACAAAAG"
# [,2]
#[1,] "GTCAGTCGATCTGGGCATTATGCGT"
#[2,] "GCTGCTAGCTAAAGCTGATCAGCAT"
#[3,] "GCCGCCCCTATGCTACGAGCATCATGCATCTGGGTCTAGCTAGTGGGCATTCTCTCTGCTGCATTCAGTCA"
#[4,] "GTGTCAGTCGTAGTCATCATCTACATCGTTCATGCTGGGCATTACAGTCAGTCA"
first.match <- str_match_all(my_string, '(.*?)CAAAAG')[[1]][1,2]
first.match
#[1] "GTCAGTCGATCTGGGCATTATGCGT"
str_locate_all(my_string, 'TGGGCATT')
#[[1]]
# start end
#[1,] 12 19
#[2,] 106 113
#[3,] 175 182
second.match.index <- str_locate_all(my_string, 'TGGGCATT')[[1]]
second.match <- substr(my_string,second.match.index[nrow(second.match.index),ncol(second.match.index)]+1,
nchar(my_string))
second.match
#[1] "TACAGTCAGTCACAAAAGGTCAGTCAGTCA"
编辑:添加“+1”是因为您想要下一个索引,而不是搜索字符串结束的索引。
首先,检查出现次数:
gregexpr('CAAAAG', my_string)
[[1]]
[1] 26 57 134 194
attr(,"match.length")
[1] 6 6 6 6
attr(,"useBytes")
[1] TRUE
gregexpr('TGGGCATT', my_string)
[[1]]
[1] 12 106 175
attr(,"match.length")
[1] 8 8 8
attr(,"useBytes")
[1] TRUE
现在你可以仔细检查这对表达式 return 相同的字符:
# Before first occurence of CAAAAG
stringr::word(my_string, 1, sep = "CAAAAG")
substr(my_string, 0, 26 - 1) # 26 first occurrence
# After last occurrence of TGGGCATT
stringr::word(my_string, -1, sep = "TGGGCATT")
substr(my_string, 175 + 8, nchar(my_string)) # 175 last occurrence + lenght of 'TGGGCATT'
此外,您可以使用 sub
和基础包中的正则表达式获得相同的结果:
# Before first occurence of CAAAAG
sub('CAAAAG.*$', '', my_string)
[1] "GTCAGTCGATCTGGGCATTATGCGT"
# After last occurrence of TGGGCATT
sub('.*TGGGCATT', '\1', my_string)
[1] "ACAGTCAGTCACAAAAGGTCAGTCAGTCA"