R语言中拆分含括号的不规则字符串至多列的技术求助
解决字符串拆分问题:保留括号内容并按特定逗号分隔
问题分析
你需要拆分的字符串结构是**[前缀] ([括号内容]) [后缀]**,多个这样的单元用逗号分隔,但后缀中可能包含逗号(如作品名Synecdoche, New York),因此不能直接按所有逗号拆分。核心需求是:
- 保留括号内外的所有内容
- 仅将下一个
(前最近的逗号作为单元分隔符,后缀内的逗号不拆分
解决方案(基于stringi包)
1. 先拆分独立单元
用正则匹配仅分隔单元的逗号:逗号后跟着的内容包含(,这样就能跳过后缀里的逗号。正则表达式为, (?=[^,]+ \\(),其中:
,:匹配逗号加空格(?=[^,]+ \\():正向预查,确保逗号后的内容包含((即下一个单元的前缀)
2. 提取每个单元的三部分
对每个拆分出的单元,用正则提取前缀、括号内内容、后缀,正则表达式为^\\s*(.*?)\\s*\\((.*?)\\)\\s*(.*)$,其中:
^\\s*:匹配开头的空白字符(.*?):非贪婪匹配前缀内容(直到第一个(前的空白)\\((.*?)\\):匹配括号及其中内容,捕获括号内的部分\\s*(.*)$:匹配括号后的空白及后缀内容(直到结尾)
代码实现
处理测试字符串
library(stringi) # 测试字符串 str <- "A (B) C, D (E) F, G, H, a (b) c" # 1. 拆分独立单元 entries <- stri_split_regex(str, ", (?=[^,]+ \\()")[[1]] # 2. 提取每个单元的三部分 split_parts <- lapply(entries, function(entry) { match_result <- stri_match_all_regex(entry, "^\\s*(.*?)\\s*\\((.*?)\\)\\s*(.*)$")[[1]] # 去除多余空白并返回三部分 c(stri_trim(match_result[2]), stri_trim(match_result[3]), stri_trim(match_result[4])) }) # 合并为最终列表 final_parts <- unlist(split_parts) print(final_parts) # 输出:[1] "A" "B" "C" "D" "E" "F, G, H" "a" "b" "c"
处理实际字符串
# 实际字符串 str2 <- "Independent Spirit Award (Co-Nominee) for Anomalisa, Academy Award (Co-Nominee) for Anomalisa, Independent Spirit Award (Co-Winner) for Synecdoche, New York, Independent Spirit Award (Nominee) for Synecdoche, New York" # 1. 拆分独立单元 entries2 <- stri_split_regex(str2, ", (?=[^,]+ \\()")[[1]] # 2. 提取每个单元的三部分 split_parts2 <- lapply(entries2, function(entry) { match_result <- stri_match_all_regex(entry, "^\\s*(.*?)\\s*\\((.*?)\\)\\s*(.*)$")[[1]] c(stri_trim(match_result[2]), stri_trim(match_result[3]), stri_trim(match_result[4])) }) # 按要求用分号连接(含末尾分号) final_result <- paste0(paste(unlist(split_parts2), collapse = "; "), ";") cat(final_result) # 输出:Independent Spirit Award; Co-Nominee; for Anomalisa; Academy Award; Co-Nominee; for Anomalisa; Independent Spirit Award; Co-Winner; for Synecdoche, New York; Independent Spirit Award; Nominee; for Synecdoche, New York;
内容的提问来源于stack exchange,提问作者alexj
相关产品推荐
相关产品推荐

