如何用正则从txt/rtf文件中提取多篇报纸文章的日期、标题与正文
实现思路
RTF格式自带格式标记,其中加粗文本会被\b和\b0标签包裹,刚好匹配你提到的标题为加粗文本的规则,结合已有的日期提取规则,可按「拆分单篇文章区块→提取区块内标题→提取区块内正文」的逻辑完成提取。
完整实现代码
library(readr) library(stringr) library(dplyr) # 读取RTF文件 raw_rtf <- read_file("bild_afd_all.rtf") # 第一步:清理无效格式标记,保留核心内容与加粗、换行标记 cleaned_text <- raw_rtf %>% # 替换换行符为特殊标记方便后续拆分 str_replace_all("\\n", "##LINE##") %>% # 移除RTF冗余控制符,保留\b(加粗开始)、\b0(加粗结束) str_remove_all("\\\\(?!b0?\\b)[a-z0-9]+\\s?") %>% str_remove_all("[{}]") %>% # 把加粗标记换成自定义分隔符方便匹配 str_replace_all("\\\\b\\s", "##BOLD_START##") %>% str_replace_all("\\\\b0\\s", "##BOLD_END##") # 第二步:提取所有日期,和你现有逻辑一致 dates <- str_extract_all(cleaned_text, "\\d{1,2} [A-Z][a-z]+ \\d{4}")[[1]] # 第三步:按日期拆分单篇文章区块 # 先给每个日期加唯一标记,拆分后每个元素对应一篇文章的完整内容 text_with_date_markers <- str_replace_all(cleaned_text, paste0("(", paste(dates, collapse = "|"), ")"), "##DATE_SPLIT##\\1") article_blocks <- str_split(text_with_date_markers, "##DATE_SPLIT##")[[1]] # 移除空的首个元素 article_blocks <- article_blocks[article_blocks != ""] # 第四步:逐块提取标题和正文 result <- lapply(seq_along(article_blocks), function(i) { block <- article_blocks[i] # 提取块内的加粗文本作为标题,取第一个符合长度要求的(过滤短的无效加粗内容) titles <- str_extract_all(block, "##BOLD_START##(.*?)##BOLD_END##")[[1]] %>% str_remove_all("##BOLD_START##|##BOLD_END##") %>% str_trim() %>% .[nchar(.) > 5] # 可根据实际标题长度调整阈值 title <- ifelse(length(titles) > 0, titles[1], NA_character_) # 提取正文:去掉日期、标题标记、换行标记后清理空白 body <- block %>% str_remove(dates[i]) %>% str_remove_all("##BOLD_START##.*?##BOLD_END##") %>% str_replace_all("##LINE##", " ") %>% str_squish() return(tibble( 日期 = dates[i], 标题 = title, 正文 = body )) }) %>% bind_rows() # 输出结果 print(result)
调整说明
如果提取的标题存在非文章标题的冗余内容,可调整.[nchar(.) > 5]的长度阈值,或增加关键词过滤规则即可。如果使用txt文件提取,可先确认txt中标题是否仍有统一格式特征(比如全大写、前后有空行等),再对应调整匹配规则即可。
内容的提问来源于stack exchange,提问作者Fred Paxton
相关产品推荐
相关产品推荐

