给出以下格式的字符串:
string_1 <- "s homo_sapiens.1 11858 281 + 248956422 TTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT"
string_2 <- "s mus_musculus.6 28206485 223 - 149736546 TTTTCTGTCTGCTAATTTGCCACCAGTCATTTCCTA----------------TTACGTGTGTCTGCTGCCTCCTAGCCCAGGCT-----TGCCCTTCCTCCC--TCTTCTGAGGTGTCATAGGGTCGTGAC--------------------TTACCTGGTTTGGGGGAGTAGTTGG---------------AAGCTGAGTGA-GTGGTGGGGTTTTCTTATGCTAAAGACCTGCGTCCAGTATAGGAAGAGCCATGTGCCTCCACTCTGGCCCTTGTGGTCT"
我需要提取以下元素:“。”后面的整数。 (即“ 1”和“ 6”;第一个整数(即“ 11858”和“ 28206485”);第二个整数(即“ 281”和“ 223”);“ +”或“-”;第三个整数(即“ 248956422”和“ 149736546”);以及字符的最终序列。
我可以提取“。”之后的整数:
library(stringr)
chr <- str_split(string_1, "[.]")[[1]][2]
chr <- substr(chr, start = 1, stop = 2)
chr <- gsub(" ", "", chr)
我可以提取第一个整数:
start <- str_extract(string_1, "(?<=\\s)\\d+(?=\\s)")
我可以提取“ +”或“-”:
strand <- str_extract(string_1, "(?<=\\s)[+-](?=\\s)")
然后我可以提取字符的最终顺序:
seq <- str_extract(string_1, "[\\w\\-]+(?=\\s*)$")
但是,我不知道如何提取其他内容。任何帮助将不胜感激!
答案 0 :(得分:1)
要提取最终的字符序列,只需使用\S+$
,因为最后的字符序列将以非空格字符的形式继续到字符串结尾。
此外,如果您愿意,可以使用此模式通过多个组来获取所有数据,
\.(\d+)\s+(\d+)\s+(\d+)\s*([-+])\s*(\d+)\s+(.*)
library(stringr)
s <- "s homo_sapiens.1 11858 281 + 248956422 TTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT"
str_match(s, pattern = "\\.(\\d+)\\s+(\\d+)\\s+(\\d+)\\s*([-+])\\s*(\\d+)\\s+(.*)")
输出
[[1]]
[,1]
[1,] ".1 11858 281 + 248956422 TTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT"
[,2] [,3] [,4] [,5] [,6]
[1,] "1" "11858" "281" "+" "248956422"
[,7]
[1,] "TTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT"
答案 1 :(得分:1)
除了usig regex之外,我不确定您要从行中获取所需组的意思是,所有行的格式均相同。
您可以将所有5组内容添加到此行中:
/^(?:[\w\s_]+)\.(\d+)\s+(\d+)\s+(\d+)\s([+-](?:\s+)\d+)\s+([\w-]+)$/gm
对于第4组,您需要使用+或-,然后使用空格和数字
是有用的资源答案 2 :(得分:1)
在基础R
中完成演练:
strings <- c("s homo_sapiens.1 11858 281 + 248956422 TTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT",
"s mus_musculus.6 28206485 223 - 149736546 TTTTCTGTCTGCTAATTTGCCACCAGTCATTTCCTA----------------TTACGTGTGTCTGCTGCCTCCTAGCCCAGGCT-----TGCCCTTCCTCCC--TCTTCTGAGGTGTCATAGGGTCGTGAC--------------------TTACCTGGTTTGGGGGAGTAGTTGG---------------AAGCTGAGTGA-GTGGTGGGGTTTTCTTATGCTAAAGACCTGCGTCCAGTATAGGAAGAGCCATGTGCCTCCACTCTGGCCCTTGTGGTCT")
pattern <- "^[^.]+\\.(?P<first>\\d)\\s+(?P<int1>\\d+)\\s+(?P<int2>\\d+)\\s+(?P<plusminus>[-+])\\s+(?P<int3>\\d+)\\s+(?P<rest>.+)"
(lst_ <- regmatches(strings, regexec(pattern, strings, perl = T)))
(df <- setNames(as.data.frame(do.call(rbind, lst_)),
c("garbage", "first", "int1", "int2", "plusminus", "int3", "rest")))
df$garbage <- NULL
df
这会产生(缩短)
first int1 int2 plusminus int3
1 1 11858 281 + 248956422
2 6 28206485 223 - 149736546
答案 3 :(得分:0)
您可以使用
str_match(string_1, "\\.(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+([-+])\\s+(\\d+)\\s+(.*)")
[,2] [,3] [,4][,5] [,6] [,7]
[1,] "1" "11858" "281" "+" "248956422" "TTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT"
请参见regex demo及其图形:
一种更简单的方法可能是:1)删除文本直到包含该文本的第一个点(使用^[^.]*\.
的正则表达式和sub
),然后2)用1+空格分割(使用简单的{ {1}}正则表达式):
\s+