2013-12-17 3 views
2

У меня есть строка вида:Извлечение нескольких повторяющихся шаблонов текстовых

txt <- "|M CHG 6 44 -1 48 -1 53 -1 63 1 64 1 65 1|" 

Первая цифра (6) означает, что модель \\s+\\d+\\s+[\\+-]?\\d+ рецидивирует 6 раз. На самом деле меня интересует только вторая (потенциально подписанная) цифра этого шаблона. Поэтому я ищу для функции или регулярное выражение, которое дает мне в результате

[1] "-1" "-1" "-1" "1" "1" "1" 

Я пробовал с

gsub("^\\|M\\s+CHG\\s+\\d+(\\s+\\d+\\s+([\\+-]?\\d+))+\\|$", replacement="\\2", x=txt, perl=TRUE) 

, а также

str_replace_all(x, perl("^\\|M\\s+CHG\\s+\\d+(\\s+\\d+\\s+([\\+-]?\\d+))+\\|$"), "\\2") 

, но в обоих случаях я получил только последнее вхождение.

+0

Выполняют ли ваши строки все то же самое, т. Е. '| M CHG \\ d'? С \\ d - одна или несколько цифр? –

+0

@ SimonO101 да! – Beasterfield

ответ

1

Одним из решений было бы раздеться начальные символы (я сделал это с regex, но вы можете захотеть использовать substr или matrix Затем напоминает формат в требуемых размеров и вернуть столбец вы хотите:.

# regex to strip superfluous characters 
# but `substring(txt , 10)` would work just as well in this example 
pat <- "^\\|M\\s+CHG\\s+\\d+\\s+(.*)\\|$" 
x <- gsub(pat , "\\1" , txt) 

# Get result 
matrix(unlist(strsplit(x , "\\s+")) , ncol = 2 , byrow = 2)[,2] 
# [1] "-1" "-1" "-1" "1" "1" "1" 

промежуточное matrix выглядит следующим образом:

#  [,1] [,2] 
#[1,] "44" "-1" 
#[2,] "48" "-1" 
#[3,] "53" "-1" 
#[4,] "63" "1" 
#[5,] "64" "1" 
#[6,] "65" "1" 
1

Я бы просто разделил на с концом | удален. Я бы взял только то, что после третьего элемента и нечетные.

var txt, txtArray, result; 

txt = "|M CHG 6 44 -1 48 -1 53 -1 63 1 64 1 65 1|"; 

// Remove the end '|'; 
txt = txt.slice(0, -1); 

// Split on one or more space... 
txtArray = txt.split(/\s+/); 


// Grab the odd ones only after the third element... 
result = txtArray.filter(function(n, i){ 
    return i > 3 && i % 2 === 0; 
}); 

console.log(result); 
+0

Я просто понял, что это не тот язык, который я знаю. Я добавил ответ в Javascript, если кому-то это понадобится! –

1

Еще один

txt <- "|M CHG 6 44 -1 48 -1 53 -1 63 1 64 1 65 1|"  


#original 
#txtsplit<-unlist(strsplit(txt, "\\s+")) 
#n=as.numeric(txtsplit[3]) 
#o<-txtsplit[4+seq(from=1, by=2, length.out=n)] 

#fixed 
txtsplit<-unlist(strsplit(txt, "\\||\\s+")) 
n=as.numeric(txtsplit[4]) 
o<-txtsplit[5+seq(from=1, by=2, length.out=n)] 

#>o 
[1] "-1" "-1" "-1" "1" "1" "1" 
+0

ваш пример создает «1 |» как последний элемент 'strsplit', но все же самое прямое решение. Я объединил ваше решение с 'gsub' @ SimonO101. – Beasterfield

+0

да, это так. Я тоже должен был избавиться от '|', рад, что это сработало – Ananta

Смежные вопросы