You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))

代码说明

  1. 排序搜索项:通过stri_order按字符串长度降序排列,让"New York"排在"New"之前,确保正则先尝试匹配更长的有效字符串。
  2. 正则构建:(to )?实现可选匹配前缀"to ",兼容带/不带该前缀的场景;用|分隔所有搜索项,形成完整匹配规则。
  3. 提取结果: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:40:48