我想从模式中第二次出现得分_
后提取数字。
按照这里的类似帖子
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
。你能帮忙吗?
答案 0 :(得分:3)
您可以使用regexpr
/ regmatches
:
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+
<强>详情
^
- 字符串开头(?:[^_]*_){2}
- 重复2次
[^_]*
- 除_
_
- 下划线[^_0-9]*
- 除_
和数字\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+).*"
<强>详细信息:强>
.*_
之前的任何内容_
首先.*_
之后和第二_
之前的任何内容_
\\d+
查找数字并将其作为选择。 .*
任何事情。 \\1
将匹配的字符串替换为第一组的值。