R,在第n次出现之前的所有内容的正则表达式

时间:2016-07-14 12:59:02

标签: regex r split

s <- "1-343-43Hello_2_323.14_fdh-99H"

在R中我想使用正则表达式来获取子串,比如说第二个下划线。如何使用一个正则表达式完成这项工作?另一种方法是用'_'分割,然后粘贴前两个 - 一些东西;

paste(sapply(strsplit(s, "_"),"[", 1:2), collapse = "_")

给予:

[1] "1-343-43Hello_2"

但是我如何制作正则表达式来做同样的事情呢?

5 个答案:

答案 0 :(得分:6)

一般来说,回答标题中的问题是

sub("^(([^_]*_){n}[^_]*).*", "\\1", s)

其中n是您允许的_的数量。

答案 1 :(得分:4)

您可以使用sub

sub("^([^_]*_[^_]*).*", "\\1", s)

请参阅regex demo

R code demo

s <- "1-343-43Hello_2_323.14_fdh-99H"
sub("^([^_]*_[^_]*).*", "\\1", s)
## => [1] "1-343-43Hello_2"

模式详情

  • ^ - 字符串开头
  • ([^_]*_[^_]*) - 第1组捕获除_以外的0 +个字符,然后是_,再次是0 +非_ s
  • .* - 字符串的其余部分(请注意TRE正则表达式.也匹配换行符。)

\\1替换只返回组1内的值。

答案 2 :(得分:0)

echo preg_replace("/([^_])_([^_]).*/" , "$1_$2" , "1-343-43Hello_2_323.14_fdh-99H");

或者如果你正在寻找匹配的int / ^ [^ ] * [^ _] * /将是匹配它的正则表达式字符串

<?php
    echo preg_match("/^[^_]*_[^_]*/" , "1-343-43Hello_2_323.14_fdh-99H" , $test );
    var_dump( $test );
?>

或在javascript中

"1-343-43Hello_2_323.14_fdh-99H".match(/^[^_]*_[^_]*/);

答案 3 :(得分:0)

sub('\\_\\d+\\..*$','',s)
#[1] "1-343-43Hello_2"

答案 4 :(得分:0)

这里是 gsub(在 data.table 中),以防您需要 perl=TRUE,(fx 前瞻和后视),不幸的是,它在 str_match 中不起作用

dtx[, var_stringr := stringr::str_match(string, '([^_]+)(?:_[^_]+){5}$')[,2]][]


dtx[
  # first select the ones with '_' so that the third element is NA
  grepl('_', string), 
  var_gsub := sub('(.*_)([^_]+)(_[^_]+){5}$',  '\\2', string)][]

这种方法的缺点是,如果你选择一个比第 n 次出现次数多的数字,而不是像 str_match 那样返回 NA,它会返回整个字符串。