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

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)

代码逻辑说明

  1. 关键词转义:把关键词里的.转义成\.,避免正则误匹配;
  2. 双正则匹配:
    • 优先匹配关键词间的有效内容,提取后更新剩余字符串;
    • 若匹配失败(说明中间只有空白),则匹配连续两个关键词,把后一个关键词作为当前关键词的内容;
  3. 剩余内容收尾:遍历完关键词对后,把字符串里剩下的内容赋值给最后一个关键词。

内容的提问来源于stack exchange,提问作者xikeck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:20:25