如何删除URL路径第二个数字子文件夹后的内容?(R语言data.table)
解决URL路径截取问题:保留到第二个数字子文件夹为止
嘿,我先帮你复现一下你的数据,这样咱们能更清楚地看到要处理的内容:
library(data.table) library(dplyr) set.seed(123) # 固定随机种子,方便咱们得到一致的示例数据 data <- data.table(column1 = paste0("/url/", c("xyz", "dsas", "ffdsfsd", "fsfddsfds", "ffdfd"))) %>% mutate(column1 = paste0(column1, "/app/"), column1 = paste0(column1, sample(5)), column1 = paste0(column1, "app"))
生成的column1示例值如下:
[1] "/url/xyz/app/3app" "/url/dsas/app/5app" "/url/ffdsfsd/app/2app" [4] "/url/fsfddsfds/app/4app" "/url/ffdfd/app/1app"
你说要删除第二个数字子文件夹之后的内容,我猜有两种常见场景:要么是当前示例里的情况——路径仅有一个数字段,要去掉数字后面的app;要么是你的实际数据里有多个带数字的子文件夹,需要保留到第二个数字段为止。下面给你两种场景对应的解决方案,都是比separate更灵活的方案:
方法1:正则表达式提取(强推!)
正则是处理这类路径截取最便捷的方式,不管路径结构有小变化,调整正则就能适配。
场景1:仅保留到最后一个数字为止(对应你的示例数据)
直接用stringr的str_extract或者base R的sub,匹配从开头到最后一个数字的所有内容:
# dplyr + stringr 写法 library(stringr) data <- data %>% mutate(column1_clean = str_extract(column1, "^.*\\d")) # 或者base R原生写法,无需额外装包 data$column1_clean <- sub("(^.*\\d).*", "\\1", data$column1)
处理后column1_clean的结果就是你想要的:
[1] "/url/xyz/app/3" "/url/dsas/app/5" "/url/ffdsfsd/app/2" [4] "/url/fsfddsfds/app/4" "/url/ffdfd/app/1"
场景2:路径有多个数字子文件夹,保留到第二个
如果你的实际路径是类似/url/123/abc/456/def/789这种,想保留到第二个数字子文件夹(也就是/url/123/abc/456),用这个正则即可:
# stringr写法 data$column1_clean <- str_extract(column1, "^(.*?\\d.*?\\d).*") # base R写法 data$column1_clean <- sub("^(.*?\\d.*?\\d).*", "\\1", data$column1)
这里的正则逻辑很直观:.*?\\d是非贪婪匹配到第一个数字,重复一次就匹配到第二个数字,把这之前的内容全部保留,后面的直接舍弃。
方法2:拆分路径后重组(不用正则的备选)
如果你对正则有点抵触,也可以把路径拆成一个个小部分,再挑选需要的部分拼回去:
对应场景1(示例数据)
data <- data %>% mutate( # 把路径按斜杠拆分为列表 path_parts = str_split(column1, "/"), # 找到第一个带数字的部分,将前面所有部分拼接起来 column1_clean = sapply(path_parts, function(parts) { num_pos <- which(str_detect(parts, "\\d"))[1] paste(parts[1:num_pos], collapse = "/") }) )
对应场景2(多个数字子文件夹)
data <- data %>% mutate( path_parts = str_split(column1, "/"), column1_clean = sapply(path_parts, function(parts) { num_positions <- which(str_detect(parts, "\\d")) # 如果有至少两个数字子文件夹,就取到第二个;没有则返回原路径 if(length(num_positions) >= 2) { paste(parts[1:num_positions[2]], collapse = "/") } else { column1 } }) )
为啥separate不好用?
separate本质是用来把一列拆成多列的,适合结构完全固定的内容。比如你的示例路径是固定的4层(/url/xxx/app/xxx),勉强能用来处理,但如果路径长度变化就会失效。举个勉强能用的例子,你感受下:
data <- data %>% separate(column1, into = c("p1", "p2", "p3", "p4"), sep = "/", extra = "merge") %>% mutate(column1_clean = paste(p1, p2, p3, str_extract(p4, "\\d"), sep = "/")) %>% select(-p1, -p2, -p3, -p4)
是不是感觉很繁琐?所以还是正则或者拆分重组的方法更靠谱。
内容的提问来源于stack exchange,提问作者Greconomist
相关产品推荐
相关产品推荐

