R语言提取最长匹配字符串:解决空格导致匹配不完整问题
解决str_extract_all提取最长匹配字符串的问题
问题背景
从数据框的address列中提取与指定字符向量匹配的名称时,使用str_extract_all因空格存在导致部分匹配结果不完整(如仅匹配到"New"而非"New York")。
可复现代码:
library(stringr) library(dplyr) library(tidyr) library(stringi) data <- data.frame (address = c("to New York street", "to New cafe", "to Paris avenue", "to London hostel")) search_string<-c("London","Paris", "New", "New York")%>% paste(collapse = " |to ") data %>% dplyr::mutate(temp_com = str_extract_all(paste(address), search_string))
当前执行结果:
address temp_com 1 to New York street to New 2 to New cafe to New 3 to Paris avenue to Paris 4 to London hostel London
期望结果:
address temp_com 1 to New York street to New York 2 to New cafe to New 3 to Paris avenue to Paris 4 to London hostel London
解决方案
核心是让正则优先匹配更长的字符串——正则默认按顺序匹配,遇到第一个符合项就停止,因此需要把长匹配项放在搜索列表的最前面。
修改后的代码
library(stringr) library(dplyr) library(stringi) data <- data.frame(address = c("to New York street", "to New cafe", "to Paris avenue", "to London hostel")) # 按字符串长度降序排序搜索项,确保长串优先被匹配 search_terms <- c("London", "Paris", "New", "New York") %>% stri_order(by_length = TRUE, decreasing = TRUE) %>% .[search_terms] # 构建正则表达式:可选匹配前缀"to ",用|分隔所有搜索项 search_pattern <- paste0("(to )?", paste(search_terms, collapse = "|")) # 用str_extract提取第一个(即最长的)匹配结果 data %>% mutate(temp_com = str_extract(address, search_pattern))
代码说明
- 排序搜索项:通过
stri_order按字符串长度降序排列,让"New York"排在"New"之前,确保正则先尝试匹配更长的有效字符串。 - 正则构建:
(to )?实现可选匹配前缀"to ",兼容带/不带该前缀的场景;用|分隔所有搜索项,形成完整匹配规则。 - 提取结果:
str_extract默认返回第一个匹配项,此时因为长串优先排序,第一个匹配就是我们需要的最长有效结果。
执行结果:
address temp_com 1 to New York street to New York 2 to New cafe to New 3 to Paris avenue to Paris 4 to London hostel London
内容的提问来源于stack exchange,提问作者Coralie
相关产品推荐
相关产品推荐

