如何在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
相关产品推荐
相关产品推荐

