在R中使用tidyr::separate,如何编写正则拆分数据为指定五列?
用tidyr提取Details列到多列的正则方案
针对你的需求,使用tidyr::extract函数(相比separate更适合从结构化字符串中提取指定字段)配合正则表达式,可以直接将Details列拆分为Reference、Pages、Date、Month、Year五列,具体实现如下:
完整代码
# 加载所需包 library(tidyr) library(dplyr) # 你的原始数据框 df <- structure(list(Details = c("\r\n\t\t\t\t\t\t\t\tReference No: F&A0067\r\n\t\t\t\t\t\t\t\tPages: 5\t\r\n\t\t\t\t\t\t\t\tPublished on: 1, January, 1965\r\n\t\t\t\t\t\t\t", "\r\n\t\t\t\t\t\t\t\tReference No: OB0233\r\n\t\t\t\t\t\t\t\tPages: 7\r\n\t\t\t\t\t\t\t\tPublished on: 26, June, 2018\r\n\t\t\t\t\t\t\t", "\r\n\t\t\t\t\t\t\t\tReference No: F&A0303\r\n\t\t\t\t\t\t\t\tPages: 1\t\r\n\t\t\t\t\t\t\t\tPublished on: 1, January, 1977\r\n\t\t\t\t\t\t\t", "\r\n\t\t\t\t\t\t\t\tReference No: BP0101\r\n\t\t\t\t\t\t\t\tPages: 7\r\n\t\t\t\t\t\t\t\tPublished on: 1, January, 1977\r\n\t\t\t\t\t\t\t", "\r\n\t\t\t\t\t\t\t\tReference No: P&IR0229\r\n\t\t\t\t\t\t\t\tPages: 4\r\n\t\t\t\t\t\t\t\tPublished on: 23, June, 2015\r\n\t\t\t\t\t\t\t", "\r\n\t\t\t\t\t\t\t\tReference No: BP0299\r\n\t\t\t\t\t\t\t\tPages: 32\r\n\t\t\t\t\t\t\t\tPublished on: 28, October, 2004\r\n\t\t\t\t\t\t\t")), row.names = c(NA, 6L), class = "data.frame") # 提取字段 df_extracted <- df %>% extract( col = Details, into = c("Reference", "Pages", "Date", "Month", "Year"), regex = "^\\s*Reference No:\\s*(\\S+)\\s+Pages:\\s*(\\S+)\\s+Published on:\\s*(\\d+),\\s*(\\w+),\\s*(\\d+)\\s*$", remove = TRUE # 可选,移除原始Details列 ) # 查看结果 print(df_extracted)
正则表达式说明
正则中的每个捕获组对应要提取的字段:
^\\s*:匹配开头任意数量的空白字符(包括换行、制表符)Reference No:\\s*(\\S+):匹配"Reference No: "后,捕获非空白字符序列(即Reference编号)\\s+Pages:\\s*(\\S+):匹配任意空白+"Pages:"后,捕获非空白字符序列(即页数)\\s+Published on:\\s*(\\d+),\\s*(\\w+),\\s*(\\d+):匹配任意空白+"Published on: "后,依次捕获日期数字、月份名称、年份数字,同时忽略分隔的逗号与空白\\s*$:匹配结尾任意数量的空白字符
结果验证
处理后第一行的提取结果为:
- Reference:
F&A0067 - Pages:
5 - Date:
1 - Month:
January - Year:
1965
完全符合你的需求。
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

