正则提取两个特定模式间含换行的Abstract title内容及工具选择
正则匹配失败原因
你写的正则有两个核心问题:
- 默认状态下正则元字符
.不匹配换行符,所以Abstract title后面跨多行的内容会被截断 - 最后一个目标块后面没有连续两个换行符,是直接到文件末尾,
(?=\n{2})这个正向预查匹配不到,所以最后两个跨多行的块都没正确提取。
通用修正正则模式如下(开启单行模式让.匹配换行,终止条件兼容连续空行和文件结尾):
/Abstract title:(.*?)(?=\n{2}|\Z)/gs
不同工具实现方案
1. grep(效率最高,适合大文件)
GNU grep支持-z参数实现多行匹配,命令如下:
grep -zPo 'Abstract title:(.*?)(?=\n{2}|\Z)' your_file.txt | sed '/^$/d'
说明:grep是C编写的流式处理工具,处理GB级大文件也比脚本语言快1-2个数量级,是纯提取场景的最优选择。
2. awk(性能接近grep,逻辑更简单不易错)
awk可以直接开启段落模式(按空行分割记录),匹配包含Abstract title的段落即可:
awk -v RS='' '/Abstract title/' your_file.txt
说明:RS='' 就是开启段落模式,每个记录是连续的非空行,只要段落里包含Abstract title就输出,不需要写复杂正则,性能和grep差距极小。
3. 脚本语言(JS/Python/R,适合需要后续处理数据的场景)
如果需要把提取结果存为结构化数据做后续分析,可以用脚本语言实现:
- JS示例:
const fs = require('fs') const content = fs.readFileSync('your_file.txt', 'utf8') const result = content.match(/Abstract title:(.*?)(?=\n{2}|\Z)/gs) console.log(result.join('\n---\n'))
- R示例:
library(stringr) content <- readLines("your_file.txt", warn = F) |> paste(collapse = "\n") result <- str_match_all(content, "Abstract title:(.*?)(?=\\n{2}|\\Z)")[[1]][,2]
说明:处理100MB以内的文件时脚本语言性能差距可以忽略,超大型文件不推荐。
内容的提问来源于stack exchange,提问作者massisenergy
相关产品推荐
相关产品推荐

