R语言中str_extract_all如何忽略\n且保留换行符用于后续处理?
解决str_extract_all匹配跨换行文本的问题
这问题我之前也碰到过!核心原因是正则表达式里的.默认不匹配换行符\n,所以你写的SESSÃO.*?(?=SESSÃO)中,.*?遇到换行就会停止匹配,自然抓不到两个SESSÃO之间的完整内容。不用删除换行符的话,有两个简单的解决方案:
方案一:启用Dotall模式(推荐)
在正则表达式开头加上(?s)修饰符,这个修饰符会让.匹配包括换行符在内的所有字符,这样就能完整捕获两个SESSÃO之间带换行的文本了:
str_extract_all(html, "(?s)SESSÃO.*?(?=SESSÃO)")
提取后的结果会完整保留原字符串中的换行符,完全满足你后续拆分的需求。
方案二:用[\s\S]替代.
如果不想用修饰符,也可以把.*?换成[\s\S]*?——\s匹配所有空白字符(包括换行),\S匹配所有非空白字符,两者组合起来就等同于匹配任意字符,同样能跨换行匹配:
str_extract_all(html, "SESSÃO[\s\S]*?(?=SESSÃO)")
这个写法的效果和方案一完全一致,选哪种全看你个人习惯。
另外补充个小细节:如果你的文本最后还有一段以SESSÃO结尾的内容,上面的正向预查(?=SESSÃO)会漏掉它。要是需要捕获最后一段,可以把正则调整为(?s)SESSÃO.*?(?=SESSÃO|$),这样就能同时匹配到最后一个SESSÃO之后的内容啦。
内容的提问来源于stack exchange,提问作者Felipe Ito
相关产品推荐
相关产品推荐

