删除部分字符串 - 正则表达式

时间:2014-09-28 12:43:50

标签: regex r

我想删除以下数据的-5p部分:

[1] mmu-miR-322-5p mmu-miR-10b-5p mmu-miR-10a-5p

我尝试了这个gsub(".-5p","",data)但是它带走了超过5p

3 个答案:

答案 0 :(得分:2)

.也会匹配前面的字符。即,您的正则表达式.-5p将匹配输入向量中的2-5pb-5pa-5p。由于字符串-5p位于最后,因此您可以在$之后使用行锚-5p的结尾。请注意,它只会删除最后一个-5p。如果它出现在中间或最初,那么它就不会做任何事情。

sub("-5p$","",data)

示例:

> s <- c("mmu-miR-322-5p", "mmu-miR-10b-5p", "mmu-miR-10a-5p")
> s
[1] "mmu-miR-322-5p" "mmu-miR-10b-5p" "mmu-miR-10a-5p"
> sub("-5p$","", s)
[1] "mmu-miR-322" "mmu-miR-10b" "mmu-miR-10a"

答案 1 :(得分:1)

在正则表达式实现中,点.是具有特殊含义的元字符。单独地,它将匹配除换行序列之外的任何单个字符,因此它会按预期移除额外字符。

由于您在每个向量元素中都出现-5p,因此sub就是您需要的所有内容。

> x <- c('mmu-miR-322-5p', 'mmu-miR-10b-5p', 'mmu-miR-10a-5p')
> sub('-5p', '', x)
# [1] "mmu-miR-322" "mmu-miR-10b" "mmu-miR-10a"

答案 2 :(得分:1)

你甚至可以在perl one liner中使用替换运算符,并使用slurping从输入文件中去除所有情况下的-5p:

Perl One班轮代码:

perl -0777 -lne "if($_ =~ s/-5p//isg) { print $_;} else { print $_;}" InputFile