RegEx用于从字符串中匹配和提取整数

时间:2019-05-03 17:45:48

标签: r regex stringr

给出以下格式的字符串:

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*)$")

但是,我不知道如何提取其他内容。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:1)

要提取最终的字符序列,只需使用\S+$,因为最后的字符序列将以非空格字符的形式继续到字符串结尾。

Check this Regex Demo

此外,如果您愿意,可以使用此模式通过多个组来获取所有数据,

\.(\d+)\s+(\d+)\s+(\d+)\s*([-+])\s*(\d+)\s+(.*)

Regex Demo with all groups

R Code Demo

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组,您需要使用+或-,然后使用空格和数字

https://regexr.com/

是有用的资源

答案 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

请参见a demo for the expression on regex101.com

答案 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及其图形:

enter image description here

一种更简单的方法可能是:1)删除文本直到包含该文本的第一个点(使用^[^.]*\.的正则表达式和sub),然后2)用1+空格分割(使用简单的{ {1}}正则表达式):

\s+