求助:无分隔符的R语言文本自动解析方案
R语言无分隔符品牌-编号文本解析方案
针对这类由「品牌: 编号」重复组成的文本,核心思路是利用正则表达式匹配每个完整的品牌-编号条目,再拆分出品牌和编号字段,避免直接按空格拆分的局限性。
方法实现(基于stringr包)
stringr包提供了便捷的字符串处理函数,适合快速实现解析:
1. 加载依赖包
library(stringr)
2. 解析基础示例文本
以第一个示例文本为例:
text <- "JOHN DEERE: PMWF2126 NEW HOLLAND: 441702A1 HIFI: WE 2126 CUMMINS: 4907485" # 提取所有品牌-编号条目 entries <- str_extract_all(text, "(.*?):\\s+(.*?)(?=\\s+[A-Z]+:|$)")[[1]] # 拆分每个条目为品牌和编号 result <- str_split_fixed(entries, ":\\s+", 2) # 转换为数据框并命名列 df <- as.data.frame(result, stringsAsFactors = FALSE) colnames(df) <- c("品牌", "编号") print(df)
输出结果:
| 品牌 | 编号 |
|---|---|
| JOHN DEERE | PMWF2126 |
| NEW HOLLAND | 441702A1 |
| HIFI | WE 2126 |
| CUMMINS | 4907485 |
3. 处理复杂文本示例
针对包含特殊符号、重复品牌的复杂文本,同样适用上述逻辑:
text <- "LANSS: EF903R DARMET: VP-2726/S CASE: 133721A1 JOHN DEERE: RE68049 JCB: 32917302 WIX: 46490 TURBO: TR25902 HIFI: SA 16080 CATERPILLAR: 4431570 KOMATSU: Z7602BXK06 KOMATSU: Z7602BX106 KOMATSU: YM12991012501 KOMATSU: YM12991012500 KOMATSU: YM11900512571 KOMATSU: 6001851320 KOMATSU: 6001851300 KOMATSU: 3EB0234790 KOMATSU: 11900512571" entries <- str_extract_all(text, "(.*?):\\s+(.*?)(?=\\s+[A-Z]+:|$)")[[1]] result <- str_split_fixed(entries, ":\\s+", 2) df_complex <- as.data.frame(result, stringsAsFactors = FALSE) colnames(df_complex) <- c("品牌", "编号") print(df_complex)
正则表达式说明
核心匹配模式"(.*?):\\s+(.*?)(?=\\s+[A-Z]+:|$)"的作用:
(.*?):\\s+:非贪婪匹配品牌部分(支持带空格的品牌名),直到遇到「冒号+空格」(.*?):非贪婪匹配编号部分(支持带空格、斜杠、连字符的编号)(?=\\s+[A-Z]+:|$):正向预查,确保编号部分在「空格+大写字母开头的品牌+冒号」或文本结尾处停止,避免拆分错误
Base R 替代实现
如果不想依赖第三方包,可使用Base R的正则函数:
text <- "JOHN DEERE: PMWF2126 NEW HOLLAND: 441702A1 HIFI: WE 2126 CUMMINS: 4907485" # 匹配所有条目位置 matches <- gregexpr("(.*?):\\s+(.*?)(?=\\s+[A-Z]+:|$)", text, perl = TRUE) entries <- regmatches(text, matches)[[1]] # 拆分品牌和编号 split_entries <- strsplit(entries, ":\\s+") df_base <- do.call(rbind, split_entries) df_base <- as.data.frame(df_base, stringsAsFactors = FALSE) colnames(df_base) <- c("品牌", "编号") print(df_base)
内容的提问来源于stack exchange,提问作者Willians Rujano
相关产品推荐
相关产品推荐

