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

如何编写正则表达式匹配并去除地址中的嵌套重复短语?

解决嵌套斜杠的重复地址匹配问题

问题分析

原正则^(.*)/(.*)$依赖贪婪匹配逻辑,会将字符串按最后一个斜杠分割,导致像702 / 9 Paddock Street / 702 / 9 Paddock Street这类含嵌套斜杠的地址被拆分为702 / 9 Paddock Street / 702和 9 Paddock Street,trim后无法匹配,因此无法识别为重复地址。

解决方案

使用反向引用的正则表达式,直接匹配整个字符串是否由某段内容(可包含斜杠)重复两次组成,中间以/分隔(前后允许空格)。修改后的处理函数如下:

replace.dupe.addresses <- function(x) {
  # 匹配"X / X"格式的重复地址,X可包含斜杠
  rep_pattern <- "^\\s*(.+)\\s*/\\s*\\1\\s*$"
  trimmed_x <- trimws(x)
  # 筛选符合重复模式的地址
  idx <- grepl(rep_pattern, trimmed_x, perl = TRUE)
  # 替换为单一的重复地址段
  x[idx] <- gsub(rep_pattern, "\\1", trimmed_x[idx], perl = TRUE)
  x
}

代码说明

  • 正则^\\s*(.+)\\s*/\\s*\\1\\s*$解析:
    • ^和$限定匹配范围为整个字符串
    • \\s*匹配任意数量的空格,处理地址前后或分隔符周围的冗余空格
    • (.+)捕获完整的重复地址段(贪婪匹配确保覆盖所有嵌套内容)
    • \\1反向引用捕获的地址段,强制要求前后两段完全一致
  • 开启perl=TRUE以支持完整的反向引用功能

测试验证

运行以下代码验证效果:

library(data.table)
d <- data.table(name = c("bill", "tom"), address = c("35 Valerie Avenue / 35 Valerie Avenue", "702 / 9 Paddock Street / 702 / 9 Paddock Street"))
d[, address := replace.dupe.addresses(address)]
print(d)

输出结果:

name               address
1: bill 35 Valerie Avenue
2:  tom 702 / 9 Paddock Street

内容的提问来源于stack exchange,提问作者matto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:45:29