如何编写正则表达式匹配并去除地址中的嵌套重复短语?
解决嵌套斜杠的重复地址匹配问题
问题分析
原正则^(.*)/(.*)$依赖贪婪匹配逻辑,会将字符串按最后一个斜杠分割,导致像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
相关产品推荐
相关产品推荐

