使用R语言提取指定起止模式间字符串遇NA问题求助
问题解决:stringr提取指定模式间内容返回NA的修复
问题场景
使用stringr包提取字符串中特定起始到结束模式间的内容,代码运行后输出NA,期望提取的内容为:"Purchased 2, one had a quality issue but they sent a replacement\n \nReviewed in the United States"
原代码:
library(stringr) s1="Ben Fisher5.0 out of 5 stars\n\n\n\n\n\n\n\n \n \n Purchased 2, one had a quality issue but they sent a replacement\n \nReviewed in the United States <U+0001F1FA><U+0001F1F8>" start_pattern <- "out of 5 stars\n\n\n\n\n\n\n\n \n \n" end_pattern <- "<U+0001F1FA>" str_extract(s1, paste0("(?<=", start_pattern, ").*(?=",end_pattern , ")"))
问题原因
- 起始模式匹配偏差:原字符串中起始模式末尾带有一个空格(
out of 5 stars\n\n\n\n\n\n\n\n \n \n),但代码里的start_pattern漏掉了这个空格,导致无法定位到正确的起始匹配位置。 - 正则换行匹配限制:默认正则规则中,
.不会匹配换行符\n,而目标内容包含换行,因此.*无法覆盖换行后的部分,最终匹配失败返回NA。
修复方案
方案1:修正起始模式并开启单行模式
library(stringr) s1="Ben Fisher5.0 out of 5 stars\n\n\n\n\n\n\n\n \n \n Purchased 2, one had a quality issue but they sent a replacement\n \nReviewed in the United States <U+0001F1FA><U+0001F1F8>" # 修正起始模式,补上末尾的空格 start_pattern <- "out of 5 stars\n\n\n\n\n\n\n\n \n \n " end_pattern <- "<U+0001F1FA>" # 用(?s)开启单行模式,让.匹配所有字符(包括换行) result <- str_extract(s1, paste0("(?s)(?<=", start_pattern, ").*(?=", end_pattern, ")")) # 可选:去除首尾多余空格 result <- str_trim(result) print(result)
方案2:用[\s\S]*代替.*匹配所有字符
如果不想开启单行模式,可使用[\s\S]*匹配所有空白与非空白字符(包含换行):
library(stringr) s1="Ben Fisher5.0 out of 5 stars\n\n\n\n\n\n\n\n \n \n Purchased 2, one had a quality issue but they sent a replacement\n \nReviewed in the United States <U+0001F1FA><U+0001F1F8>" start_pattern <- "out of 5 stars\n\n\n\n\n\n\n\n \n \n " end_pattern <- "<U+0001F1FA>" result <- str_extract(s1, paste0("(?<=", start_pattern, ")[\\s\\S]*(?=", end_pattern, ")")) result <- str_trim(result) print(result)
两种方案均可输出期望内容:"Purchased 2, one had a quality issue but they sent a replacement\n \nReviewed in the United States"
内容的提问来源于stack exchange,提问作者student_R123
相关产品推荐
相关产品推荐

