在第二次匹配某个字符串后提取数字

时间:2018-03-24 21:26:00

标签: r regex string

我想从模式中第二次出现得分_后提取数字。

按照这里的类似帖子

Matching different digits after a lookahead

regex - return all before the second occurrence

我试过

    library(stringr)

  pattern <- c("1/2/3_500k/855kk_1400k/AVBB")

  str_extract(pattern, "(^_){2}(\\d+\\.*\\d*)")

输出

  

[1] NA

而不是1400。你能帮忙吗?

2 个答案:

答案 0 :(得分:3)

您可以使用regexpr / regmatches

的基础R解决方案
regmatches(x, regexpr("^(?:[^_]*_){2}[^_0-9]*\\K\\d*\\.?\\d+", x, perl=TRUE))

或者sub

sub("^(?:[^_]*_){2}[^_0-9]*(\\d*\\.?\\d+).*", "\\1", x)

请参阅R demo online

正则表达式是

^(?:[^_]*_){2}[^_0-9]*\K\d*\.?\d+

请参阅online regex demo

<强>详情

  • ^ - 字符串开头
  • (?:[^_]*_){2} - 重复2次
    • [^_]* - 除_
    • 以外的任何0 +字符
    • _ - 下划线
  • [^_0-9]* - 除_和数字
  • 以外的任何0 +字符
  • \K - 匹配重置运算符,丢弃目前为止匹配的所有文本
  • \d*\.?\d+ - 浮点数或整数数字模式(0+位数,可选.然后是1+位数。)

sub正则表达式变体中,\K不是必需的,数字模式被捕获到捕获组中,其余字符串与.*模式匹配。结果是第1组的内容,用\1占位符引用。

答案 1 :(得分:1)

一个选项可能是:

pattern <- c("1/2/3_500k/855kk_1400k/AVBB")
sub(".*_*_(\\d+).*","\\1", pattern, perl = TRUE)
[1] "1400"

regex是:

".*_*_(\\d+).*"

<强>详细信息:

    首先{li> .*_之前的任何内容_ 首先.*_之后和第二_ 之前的任何内容
  • _
  • \\d+查找数字并将其作为选择。
  • 之后
  • .*任何事情。

\\1将匹配的字符串替换为第一组的值。