正则表达式 - 在第二次出现之前返回所有内容

时间:2011-09-16 19:39:30

标签: regex r

鉴于此字符串:

DNS000001320_309.0/121.0_t0

如何在第二次出现“_”之前返回所有内容?

DNS000001320_309.0/121.0

我正在使用R。

感谢。

4 个答案:

答案 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="_")