R语言按多分割规则拆分字符串并保留分割规则的实现问询
没问题,这个需求用stringr完全可以实现,核心是先识别出发言者的标识(不管前面有没有头衔),再把文本分割成对应每个发言者的内容,最后映射到你指定的Names格式。下面是具体的步骤和代码:
首先,我们需要先匹配所有包含目标名字的发言者标识(比如Julie (title) :或Rt Hon Ellen:),然后提取出你需要的Julie:/Ellen:格式,再分割文本得到对应的发言内容。
完整代码示例
library(stringr) library(dplyr) # 用来绑定行,也可以用base R的do.call(rbind, ...)替代 # 你的原始数据 data <- "Julie (title) : This is the text Julie has: said. Extra sentence one. Extra sentence 2 and so on. Rt Hon Ellen: This is the text Ellen has said in response to Julie. TITLE OF SECTION Julie: More words from Julie." names <- c("Julie:", "Ellen:") # 第一步:构造正则,匹配任何前缀+名字+冒号的发言者标识 # 先把名字中的冒号去掉,用来匹配带前缀的标识 name_no_colon <- str_remove(names, ":") speaker_pattern <- paste0("(?:.*?\\b)(", name_no_colon, "):") %>% paste(collapse = "|") # 第二步:提取所有发言者标识,并映射到你需要的Names格式 speakers <- str_extract_all(data, speaker_pattern)[[1]] speakers_clean <- str_extract(speakers, paste(names, collapse = "|")) # 第三步:用发言者标识分割文本,得到对应的发言内容 split_text <- str_split(data, speaker_pattern)[[1]] # 去掉分割后第一个空内容(标识之前的部分),然后清理空格 split_text_clean <- split_text[-1] %>% str_trim() # 第四步:整理成你需要的data.frame result <- data.frame( Names = speakers_clean, text = split_text_clean ) # 查看结果 print(result)
输出结果
Names text 1 Julie: This is the text Julie has: said. Extra sentence one. Extra sentence 2 and so on. 2 Ellen: This is the text Ellen has said in response to Julie. TITLE OF SECTION 3 Julie: More words from Julie.
为什么不用str_split直接分割?因为str_split默认会丢弃分割符,而且没法直接关联分割符和对应的文本段。我们这里先捕获所有发言者标识,再分割文本,就能完美保留每个分割规则(即你指定的Names)和对应内容啦。
内容的提问来源于stack exchange,提问作者Julie Mugford
相关产品推荐
相关产品推荐

