【问题标题】:regex - return all before the second occurrence正则表达式 - 在第二次出现之前返回所有
【发布时间】:2011-09-16 19:39:30
【问题描述】:

给定这个字符串:

DNS000001320_309.0/121.0_t0

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

DNS000001320_309.0/121.0

我正在使用 R。

谢谢。

【问题讨论】:

  • 任何保证字符串总是有第二个_?您想如何处理下划线为 0 或 1 个的情况?
  • 它总是有 2 个“_”...保证!该字符串是使用sep="_" 的3 个字符串的paste

标签: regex r


【解决方案1】:

以下脚本:

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)。我绝对比我更喜欢你的解决方案:)
  • 如果下划线超过2个怎么办?有没有办法进一步推广这个函数?
【解决方案2】:

我认为这可能会完成任务(正则表达式匹配最后一次出现 _ 之前的所有内容):

_([^_]*)$

例如:

> sub('_([^_]*)$', '', "DNS000001320_309.0/121.0_t0")
[1] "DNS000001320_309.0/121.0"

【讨论】:

  • 是的,如果走正则表达式路径,sub 会比gsub 更合适。
  • 如果有两个以上的下划线,这将选择超过第二个下划线,尽管显然这对 OP 无关紧要,所以我指出它只是为了后代。
  • 是的,好点@joran。这对 OP 来说可能很重要,但他可能没有意识到这一点。
【解决方案3】:

就我个人而言,我讨厌正则表达式,所以幸运的是,有一种方法可以在没有它们的情况下做到这一点,只需拆分字符串:

> s <- "DNS000001320_309.0/121.0_t0"      
> paste(strsplit(s,"_")[[1]][1:2],collapse = "_")
[1] "DNS000001320_309.0/121.0"

虽然这当然假设您的字符串中总是至少有 2 个下划线,所以如果您对它进行矢量化,请小心,而事实并非如此。

【讨论】:

  • 这非常有用。你能解释一下第一个双括号索引/数字(即 [[1]])在做什么吗?
  • @KDA strsplit() 是矢量化的,因此它返回已拆分的矢量列表。如果你只有一个元素,你仍然需要采摘第一个元素。
【解决方案4】:

不漂亮,但这样可以解决问题

mystr <- "DNS000001320_309.0/121.0_t0"

mytok <- paste(strsplit(mystr,"_")[[1]][1:2],collapse="_")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多