You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用正则表达式将单列字符串拆分为三列的技术问题

解决R中extract函数拆分字符串的正则匹配问题

问题分析

需要将单列字符串拆分为三列:

  • ID:开头固定24位字母数字组合
  • Type:中间可变长度字段,可包含&、空格、/、逗号,不含数字
  • Numerical:末尾固定14位数值序列(含小数点)

错误原因

你之前的正则存在三个核心问题:

  1. 语法错误:.{24) 缺少闭合的 },导致正则无法解析
  2. 中间捕获组 [a-zA-Z]* 仅匹配字母,无法覆盖Type允许的特殊符号,且*无法匹配非空的可变长度内容
  3. 末尾捕获组 .{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:13:21