使用正则表达式将单列字符串拆分为三列的技术问题
解决R中extract函数拆分字符串的正则匹配问题
问题分析
需要将单列字符串拆分为三列:
- ID:开头固定24位字母数字组合
- Type:中间可变长度字段,可包含&、空格、/、逗号,不含数字
- Numerical:末尾固定14位数值序列(含小数点)
错误原因
你之前的正则存在三个核心问题:
- 语法错误:
.{24)缺少闭合的},导致正则无法解析 - 中间捕获组
[a-zA-Z]*仅匹配字母,无法覆盖Type允许的特殊符号,且*无法匹配非空的可变长度内容 - 末尾捕获组
.{14}匹配任意字符,未限制为数值类型,可能匹配到无效内容
正确正则与代码
使用tidyr::extract函数,搭配精准的正则表达式即可解决:
library(tidyr) data <- data.frame( string=c("c23uij49753dfd3273shdjsh /Animals/Birds/Cardinal 0.873289139232", "91873nc9248jfe08jsdif894 /Animals/Mammals/Felines/Tigers 0.989734823872", "38939137fhjnffnf73nxlppa /Transportation/Automobiles & Vehicles/Ford-Explorer 0.983947399348")) output <- extract(data, string, into = c('ID', "Type", "Numerical"), regex = "^([A-Za-z0-9]{24})\\s+([^0-9]+?)\\s+([0-9.]{14})$", remove = FALSE) # 查看拆分结果 print(output)
正则规则说明
^([A-Za-z0-9]{24}):匹配开头24位字母数字,作为ID列\\s+:匹配ID与Type之间的一个或多个空格(兼容多空格分隔场景)([^0-9]+?):非贪婪匹配所有非数字字符(包含允许的&、/、空格等),作为Type列;非贪婪模式避免将Type末尾的空格纳入\\s+:匹配Type与Numerical之间的一个或多个空格([0-9.]{14}):匹配末尾14位由数字和小数点组成的数值,作为Numerical列$:匹配字符串结尾,确保正则覆盖整行内容
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

