RegEx для сопоставления и извлечения целых чисел из строки - PullRequest
3 голосов
/ 03 мая 2019

Заданы строки в формате:

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 ]

1 голос
/ 03 мая 2019

Полное прохождение в базе 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

См. демонстрацию для выражения на regex101.com .

1 голос
/ 03 мая 2019

Я не уверен, что вы имеете в виду, помимо usig регулярного выражения, чтобы получить группы, которые вы хотите из строки, если все строки отформатированы одинаково.

Вы можете получить все 5 групп с такой строкой:

/^(?:[\w\s_]+)\.(\d+)\s+(\d+)\s+(\d+)\s([+-](?:\s+)\d+)\s+([\w-]+)$/gm

Для группы 4 у вас будет + или -, затем пробел, затем число

aПолезный ресурс https://regexr.com/

1 голос
/ 03 мая 2019

Для извлечения последней последовательности символов вы можете просто использовать \S+$, поскольку последняя последовательность символов продолжается как непробельные символы до конца строки.

Проверьте это регулярное выражениеДемо

Кроме того, если вы хотите, вы можете использовать этот шаблон для захвата всех ваших данных, используя несколько групп,

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

Regex Demo свсе группы

R Код Демо

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"
0 голосов
/ 03 мая 2019

Вы можете использовать

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 и ее график:

enter image description here

Более простой подход может состоять в том, чтобы: 1) удалить текст до первой точки, включающей его (используя регулярное выражение ^[^.]*\. с sub), а затем 2) разделить пробелами 1+ (используя простое регулярное выражение \s+):

data <- sub("^[^.]*\\.", "", string_1)
strsplit(data, "\\s+")
# [[1]]
# [1] "1"                                                                                                                                                                                                                                                                                         
# [2] "11858"                                                                                                                                                                                                                                                                                     
# [3] "281"                                                                                                                                                                                                                                                                                       
# [4] "+"                                                                                                                                                                                                                                                                                         
# [5] "248956422"                                                                                                                                                                                                                                                                                 
# [6] "TTTTCTTTTCGTTAACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT"
...