提取多个重复的文本模式

时间:2013-12-17 13:33:45

标签: regex r grep stringr

我有一个字符串看起来像这样:

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

但在这两种情况下我只返回了最后一次出现的事件。

3 个答案:

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