我有一个字符串看起来像这样:
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 :(得分:1)
我只是在上使用拆分,删除了结尾
|
。我只会选择第3个元素和奇数元素之后的内容。
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 );
答案 1 :(得分:1)
一种解决方案是删除开始字符(我使用regex
完成此操作但你可能想要使用substr
或simillar。然后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"
答案 2 :(得分: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"