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

如何在R中提取文本里两个唯一短语之间的多个段落

R提取A:与B:之间段落的实现方法

方法1:使用stringr包处理(推荐,逻辑直观)

library(stringr)

# 示例文本,你可以替换为自己读入的文本内容
text <- "text I do not want 

A:paragraph1

paragraph2

B:text I do not want

A:paragraph3

paragraph4

B:text I do not want"

# 提取所有A:到下一个B:之间的内容,自动忽略A:和B:本身
matched_segs <- str_extract_all(text, "(?<=A:)([\\s\\S]*?)(?=B:)")[[1]]

# 去掉所有空白/换行,拼接段落,再按要求首字母大写、用逗号分隔不同块
processed <- paste0(gsub("\\s+", "", matched_segs), collapse = ",")
result <- str_replace_all(processed, "paragraph", "Paragraph")

print(result)
# 输出结果:[1] "Paragraph1Paragraph2,Paragraph3Paragraph4"

方法2:base R无依赖实现

不需要安装第三方包,用基础函数就能实现:

matched_segs <- regmatches(text, gregexpr("(?<=A:)([\\s\\S]*?)(?=B:)", text, perl = TRUE))[[1]]
processed <- paste0(gsub("\\s+", "", matched_segs), collapse = ",")
result <- gsub("paragraph", "Paragraph", processed)
print(result)

如果你已经按行读取为行向量

如果之前已经用readLines把文本读成了每行一个元素的向量,可以用下面的逻辑处理:

# 假设lines是你已经按行读取得到的向量
lines <- readLines(textConnection(text))

# 定位所有A:和B:所在的行号
a_loc <- which(startsWith(lines, "A:"))
b_loc <- which(startsWith(lines, "B:"))

# 逐段提取A:到B:之间的内容
seg_list <- mapply(function(a, b) {
  seg_content <- lines[a:(b-1)]
  seg_content <- gsub("^A:", "", seg_content)
  seg_content <- seg_content[seg_content != ""]
  paste0(seg_content, collapse = "")
}, a_loc, b_loc)

# 拼接为最终结果
result <- paste0(gsub("paragraph", "Paragraph", seg_list), collapse = ",")

正则逻辑说明

  • (?<=A:) 是正向回顾断言,只匹配前面紧跟A:的位置,不会把A:本身计入提取结果
  • [\\s\\S]*? 匹配任意字符(包括换行符),非贪婪模式保证只匹配到最近的下一个B:就停止
  • (?=B:) 是正向前瞻断言,只匹配后面紧跟B:的位置,不会把B:本身计入提取结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:06:02