R语言:提取关键词对间非空白内容的特殊规则实现需求
R语言提取关键词间非空白内容的实现方案
问题说明
需要从长字符串里提取连续关键词对之间的有效内容:如果两个关键词之间只有空白,就跳过空白,找下一个右边界关键词,提取中间的非空白内容。
示例数据
- 目标长字符串:
"Str. A. Str. B. Str. B. Some data. Str. A. More data. Str. B. Other data. Str. A. Str. B. Str. B. Some more data." - 完整关键词列表:
c("Str. A.", "Str. B.", "Str. A.", "Str. B.", "Str. A.", "Str. B.")
期望输出
keywords content Str. A. Str. B. Str. B. Some data. Str. A. More data. Str. B. Other data. Str. A. Str. B. Str. B. Some more data.
之前尝试的无效方法
- 用
strsplit()函数,处理不了关键词间仅含空白的场景; - 尝试正则提取后移除已处理部分循环操作,同样解决不了空白问题;
- 仅当关键词不含空白时,能用
^Str\.A\.\s+(\S+)\s+Str\.B\.提取,但不想把移除关键词空白作为最终方案。
可行解决方案
通过循环遍历关键词列表,结合正则表达式逐步匹配并处理空白场景,使用stringr包简化操作:
library(stringr) # 输入数据 target_str <- "Str. A. Str. B. Str. B. Some data. Str. A. More data. Str. B. Other data. Str. A. Str. B. Str. B. Some more data." keywords <- c("Str. A.", "Str. B.", "Str. A.", "Str. B.", "Str. A.", "Str. B.") # 初始化结果数据集 result <- data.frame(keywords = character(), content = character(), stringsAsFactors = FALSE) # 遍历每一组连续关键词 for (i in 1:(length(keywords)-1)) { current_key <- keywords[i] next_key <- keywords[i+1] # 转义关键词中的正则特殊字符(比如.) current_key_esc <- str_replace_all(current_key, "\\.", "\\\\.") next_key_esc <- str_replace_all(next_key, "\\.", "\\\\.") # 正则1:匹配当前关键词到下一个关键词之间的非空白内容 pattern_content <- str_glue("^{current_key_esc}\\s+((?:(?!{next_key_esc}).)+)\\s+{next_key_esc}") match_content <- str_match(target_str, pattern_content) if (!is.na(match_content[1,2])) { # 提取并清理内容 content <- str_trim(match_content[1,2]) result <- rbind(result, data.frame(keywords = current_key, content = content)) # 移除已处理的字符串部分 target_str <- str_replace(target_str, pattern_content, "") } else { # 正则2:处理关键词间仅含空白的情况,把下一个关键词作为内容 pattern_blank <- str_glue("^{current_key_esc}\\s+{next_key_esc}") if (str_detect(target_str, pattern_blank)) { result <- rbind(result, data.frame(keywords = current_key, content = next_key)) target_str <- str_replace(target_str, pattern_blank, "") } } } # 处理最后一个关键词对应的剩余内容 if (str_trim(target_str) != "") { result <- rbind(result, data.frame(keywords = keywords[length(keywords)], content = str_trim(target_str))) } # 输出结果 print(result, row.names = FALSE)
代码逻辑说明
- 关键词转义:把关键词里的
.转义成\.,避免正则误匹配; - 双正则匹配:
- 优先匹配关键词间的有效内容,提取后更新剩余字符串;
- 若匹配失败(说明中间只有空白),则匹配连续两个关键词,把后一个关键词作为当前关键词的内容;
- 剩余内容收尾:遍历完关键词对后,把字符串里剩下的内容赋值给最后一个关键词。
内容的提问来源于stack exchange,提问作者xikeck
相关产品推荐
相关产品推荐

