鉴于此字符串:
DNS000001320_309.0/121.0_t0
如何在第二次出现“_”之前返回所有内容?
DNS000001320_309.0/121.0
我正在使用R。
感谢。
答案 0 :(得分:42)
以下脚本:
s <- "DNS000001320_309.0/121.0_t0"
t <- gsub("^([^_]*_[^_]*)_.*$", "\\1", s)
t
将打印:
DNS000001320_309.0/121.0
正则表达式的快速解释:
^ # the start of the input
( # start group 1
[^_]* # zero or more chars other than `_`
_ # a literal `_`
[^_]* # zero or more chars other than `_`
) # end group 1
_ # a literal `_`
.* # consume the rest of the string
$ # the end of the input
替换为:
\\1 # whatever is matched in group 1
如果下划线少于2个,则不会更改字符串。
答案 1 :(得分:12)
就个人而言,我讨厌正则表达式,幸运的是有一种方法可以在没有它们的情况下做到这一点,只需要分割字符串:
> s <- "DNS000001320_309.0/121.0_t0"
> paste(strsplit(s,"_")[[1]][1:2],collapse = "_")
[1] "DNS000001320_309.0/121.0"
虽然当然这假设你的字符串中总会有至少2个下划线,但是如果你对它进行矢量化则要小心,但事实并非如此。
答案 2 :(得分:10)
我认为这可能会完成任务(正则表达式匹配_
最后一次出现之前的所有内容):
_([^_]*)$
E.g:
> sub('_([^_]*)$', '', "DNS000001320_309.0/121.0_t0")
[1] "DNS000001320_309.0/121.0"
答案 3 :(得分:7)
不是很漂亮,但这样做就可以了。
mystr <- "DNS000001320_309.0/121.0_t0"
mytok <- paste(strsplit(mystr,"_")[[1]][1:2],collapse="_")