使用R的tidyr包extract函数提取数值范围时报正则分组错误如何解决
错误原因
tidyr::extract()要求正则表达式中定义的捕获组数量和into参数指定的输出列数量完全一致。你当前使用的正则\\d+(\\s?)-(\\s?)\\d+$里有2个捕获组(就是包裹\\s?的两对括号),但你into参数只指定了1个输出位置,数量不匹配所以触发报错。
调整方案
你不需要单独捕获减号两侧的空格,直接把整个要提取的数值范围作为唯一的捕获组即可,有两种写法可选:
- 直接删掉多余的括号,给目标内容外层套捕获组(更简洁,推荐)
- 把原有匹配空格的括号改成非捕获组(括号开头加
?:,不会被计数为输出分组)
可运行代码示例
library(dplyr) library(tidyr) df_raw %>% extract( col = value, into = "num_range", # 给提取出的数值范围列命名,不要留空字符串 regex = "(\\d+\\s?-\\s?\\d+)$", # 仅1个捕获组,对应完整的数值范围 remove = FALSE # 可选参数,设为TRUE会删除原始的value列 )
如果要使用非捕获组的写法,正则部分替换为下面的即可,效果完全一致:
regex = "(\\d+(?:\\s?)-(?:\\s?)\\d+)$"
内容的提问来源于stack exchange,提问作者richardgasquet
相关产品推荐
相关产品推荐

