如何从两边拆分字符串数组?

时间:2015-07-23 16:28:41

标签: regex r

我有一个以这种格式的字符串数组(n = 1000):

   strings<-c("GSM1264936_2202_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL.gz",
           "GSM1264937_2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL.gz",
           "GSM1264938_2202_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL.gz")

我想知道这可能是一个简单的方法:

strings2<-c(2201_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL,
           2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL,
           2203_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL)

表示从前面剪掉“GSM1234567”,从末尾剪下“.gz”。

5 个答案:

答案 0 :(得分:2)

只需一个gsub解决方案,匹配以数字和字母符号开始^的字符串,*的零次或多次,直到遇到_并且(更确切地说) &#34;或&#34;)最后.gz $的片段或字符串。

 gsub("^([[:alnum:]]*_)|(\\.gz)$", "", strings)
[1] "2202_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL"
[2] "2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL"
[3] "2202_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL"

修改

我忘了逃避第二点。

答案 1 :(得分:1)

strings <- c("GSM1264936_2202_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL.gz", "GSM1264937_2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL.gz", "GSM1264938_2202_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL.gz")
strings2 <- lapply(strings, function (x) substr(x, 12, 58))

答案 2 :(得分:1)

您可以使用sub

执行此操作
sub('[^_]+_(.*)\\.gz', '\\1', strings)
# [1] "2202_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL"
# [2] "2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL"
# [3] "2202_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL"

答案 3 :(得分:0)

尝试:

 gsub('^[^_]+_|\\.[^.]*$','',strings)

答案 4 :(得分:0)

我强烈建议分两步完成。其他解决方案有效,但完全不可读:它们不表达代码的 intent 。这是明确表达的:

trimmed_prefix = sub('^GSM\\d+_', '', strings)
strings2 = sub('\\.gz$', '', trimmed_prefix)

但诚然,这个可以一步表达,并且看起来不会太糟糕,如下所示:

strings2 = sub('^GSM\\d+_(.*)\\.gz$', '\\1', strings)

一般情况下,请仔细考虑您实际想要匹配的模式:您的问题是要匹配前缀“GSM1234567”,但您的示例与此相矛盾。我通常会选择尽可能具体的模式,以避免意外匹配错误的输入。