R基础提取PDF文本后,正则匹配指定字符串报错求助
解决R中提取换行后空格后字符串的正则问题
问题诊断
你的代码报错核心原因有两个:
- R基础正则默认不支持反向预查(
(?<=...))语法,必须通过perl=TRUE开启Perl兼容模式; - 原正则仅匹配单个单词字符
\\w,无法捕获完整的目标字符串。
修正方案
方案1:反向预查+完整单词匹配(需Perl模式)
这个方案贴合你原本的思路,通过反向预查定位换行+空格的位置,再匹配其后的完整单词:
texte <- "What I don't want\n WHATIWANT\n OtherStuff I don't want \n I don't want this either." # 匹配换行+任意空格后的连续单词字符 regex <- "(?<=\\n\\s+)\\w+" # 必须开启perl=TRUE才能使用反向预查 debut <- gregexpr(regex, texte, perl = TRUE) # 提取匹配到的内容 regmatches(texte, debut)
运行结果:[1] "WHATIWANT" "OtherStuff" "I"
方案2:无预查的捕获组方案(纯基础R)
如果不想依赖Perl正则,可直接用捕获组定位目标内容,再剥离前缀:
texte <- "What I don't want\n WHATIWANT\n OtherStuff I don't want \n I don't want this either." # 匹配换行+空格+目标单词,用括号捕获目标部分 regex <- "\\n\\s+(\\w+)" debut <- gregexpr(regex, texte) # 提取捕获的内容 sapply(regmatches(texte, debut)[[1]], function(x) sub("^\\n\\s+", "", x))
同样能得到和方案1一致的结果。
方案3:提取换行后整行内容(若需完整行)
如果你的需求是获取换行+空格后的整行内容(而非仅第一个单词),调整正则即可:
regex <- "(?<=\\n\\s+).*?(?=\\n|$)" debut <- gregexpr(regex, texte, perl = TRUE) regmatches(texte, debut)
运行结果:[1] "WHATIWANT" "OtherStuff I don't want " "I don't want this either."
补充说明
- 若目标字符串包含非单词字符(如标点、特殊符号),把正则中的
\\w+替换为[^\\n]+,即可匹配任意非换行的连续字符; - 处理多PDF时,可将上述逻辑封装为函数,循环读取每个PDF提取的文本后批量处理。
内容的提问来源于stack exchange,提问作者Matthieu Gousseff
相关产品推荐
相关产品推荐

