使用separate_wider_regex拆分字符串报错,求问题原因与解决方法
问题分析与解决
你的代码报错原因是正则模式未覆盖整个输入字符串:separate_wider_regex要求每个输入字符串必须被定义的patterns完全匹配分割,但你的正则没有处理字符串末尾的),导致部分字符未被分配到任何模式,触发错误。
修正后的代码
以下两种方案都能实现你的需求:
方案1:显式匹配所有字符(含无意义符号)
library(tidyverse) tta <- data.frame(res=c("Y33@N(A)","H5@O(B)")) ttb <- tta %>% separate_wider_regex( res, patterns = c( resn = "[A-Za-z]+", # 匹配Y/H resi = "\\d+", # 匹配33/5 "@", # 匹配@(不生成列) name = "[A-Za-z]+", # 匹配N/O "\\(", # 匹配((不生成列) chain = "[A-Za-z]+", # 匹配A/B "\\)" # 匹配)(不生成列) ) )
方案2:调整正则捕获逻辑,同时覆盖剩余字符
如果你想保留原正则的预查写法,可以在最后添加一个匹配剩余字符的模式(无需捕获):
library(tidyverse) tta <- data.frame(res=c("Y33@N(A)","H5@O(B)")) ttb <- tta %>% separate_wider_regex( res, patterns = c( resn = "^[A-Za-z]+", resi = "\\d+(?=@)", name = "(?<=\\@)[a-zA-Z]+(?=\\()", chain = "(?<=\\()[a-zA-Z]+", ignore = "\\)" # 匹配末尾的),不生成列 ), too_few = "debug" )
运行结果
两种方案都会生成如下的ttb数据框:
| resn | resi | name | chain |
|---|---|---|---|
| Y | 33 | N | A |
| H | 5 | O | B |
内容的提问来源于stack exchange,提问作者cwind
相关产品推荐
相关产品推荐

