使用tidyr::extract处理非全部存在的分组时遇到的问题
解决tidyr::extract匹配可选捕获组的问题
问题出在两个核心细节上:
- 正则未锚定整个字符串,且可选组前的空格处理不当,导致仅含单个条目(如第二行)的字符串无法匹配
- 字符类写法错误:
[a|b]会错误匹配a、|、b,二选一的正确写法是[ab]
正确实现代码
library(tidyverse) foo <- data.frame(test = c("a big tomato b big orange", "b big tomato", "b big apple a big pear")) # 锚定首尾,将第二个完整条目(含前置空格)设为可选 extract(foo, test, into = c("group_1", "fruit_1", "group_2", "fruit_2"), regex = "^([ab]) big ([a-zA-Z]*)(?: ([ab]) big ([a-zA-Z]*))?$")
输出结果
group_1 fruit_1 group_2 fruit_2 1 a tomato b orange 2 b tomato <NA> <NA> 3 b apple a pear
正则说明
^和$:锚定字符串的开头和结尾,确保正则匹配整个输入内容,避免部分匹配导致的NA结果([ab]) big ([a-zA-Z]*):匹配第一个必填的组-水果组合(?: ([ab]) big ([a-zA-Z]*))?:将第二个完整的组-水果组合(含前置空格)设为非捕获可选结构,?标记该部分可出现0次或1次,?:表示不捕获整个可选组,仅保留内部的两个捕获组
内容的提问来源于stack exchange,提问作者tjebo
相关产品推荐
相关产品推荐

