我有一个值的矢量,格式如下:

c("T12_50;是13_50;是3_33", "是15_100")

我需要提取以下三个元素之后的值

  • 位数未知的数字
  • 下划线

在这种情况下,第一个元素("T12_50;是13_50;是3_33")应为c(50,33),第二个元素("是15_100")应为c(100).

str_extract_all ("T12_50;是13_50;是3_33", "(?<=是\\d+_)\\d+") 

但它会产生一个错误

回溯模式匹配必须具有限定的最大长度.

在try 之后,我明白了问题是我不能在正则表达式的后备部分中使用"d+".这里会有什么替代方案?

推荐答案

我推荐100 with a regex modification,其中正向回溯转换为消费模式,您需要返回的部分包含在捕获括号中(例如101->;102):

x <- c("T12_50;Y13_50;Y3_33", "Y15_100")
library(stringr)
res <- lapply(str_match_all(x, "Y\\d+_(\\d+)"), function(m) m[,-1])

或者base R solution,其中使用了PCRE正则表达式,在\K运算符的帮助下,可以"截断"不需要的部分

res <- regmatches(x, gregexpr("Y\\d+_\\K\\d+", x, perl=TRUE))

res个就够了

[[1]]
[1] "50" "33"

[[2]]
[1] "100"

请看R demo.

是的,由于stringr包使用了支持限制宽度外观的ICU regex library,如果您确定Y_之间的数字不能超过ICU regex library且不少于1位,您就可以真正使用stringr::str_extract_all(x, "(?<=Y\\d{1,100}_)\\d+").你不能在ICU的正则表达式中使用*+:

回溯模式匹配的可能字符串的长度不能是无界的(不能有*+运算符).

R相关问答推荐

在ggplot Likert条中添加水平线

根据R中两个变量的两个条件删除带有dspirr的行

从R导出全局环境中的所有sf(numrames)对象

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

在df中保留原始变量和新变量

如何使用同比折线图中的个别日

观察器中的inaliateLater的位置

远离理论值的伽马密度曲线下面积的近似

如何在PrePlot()中将多个元素设置为斜体

`-`是否也用于数据帧,有时使用引用调用?

为R中的16组参数生成10000个样本的有效方法是什么?

在同一单元格中创建包含整数和百分比的交叉表

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

R dplyr::带有名称注入(LHS of:=)的函数,稍后在:=的RHS上引用

reshape 数据帧-基于组将行转换为列

通过不完全重叠的多个柱连接

如何将数据框压缩为更宽,同时将行输入保持为行输入,而不是R中的列名?

用LOOCV进行K近邻问题

有没有一种方法可以用非标准参数编写一个定制的ggploy主题函数?