R字符串中的最后一个斜杠后如何用“ _”替换空格

时间:2018-11-08 19:04:25

标签: r regex

我有一个字符串列表,对于每个字符串,我需要在最后一个斜杠后用“ _”替换所有空格。这是一个最小的可复制示例。

my_list <- list("abc/as 345/as df.pdf", "adf3344/aer4 ffsd.doc", "abc/3455/dfr.xls", "abc/3455/dfr serf_dff.xls", "abc/34 5 5/dfr 345 dsdf 334.pdf")

替换后,结果应为:

list("abc/as 345/as_df.pdf", "adf3344/aer4_ffsd.doc", "abc/3455/dfr.xls", "abc/3455/dfr_serf_dff.xls", "abc/34 5 5/dfr_345_dsdf_334.pdf")

我想到了使用正则表达式在最后一个斜杠之后匹配文本,然后将“”替换为“ _”,但是没有找到实现它的方法。 就像这样: gsub(pattern, "_", my_list), 正则表达式用哪种模式表示:匹配最后一个斜杠后的每个空格(列表的每个元素中至少有一个斜杠)。

4 个答案:

答案 0 :(得分:5)

您可以使用否定前瞻:

gsub(" (?!.*/.*)", "_", unlist(my_list), perl = TRUE)
# [1] "abc/as 345/as_df.pdf"            "adf3344/aer4_ffsd.doc"          
# [3] "abc/3455/dfr.xls"                "abc/3455/dfr_serf_dff.xls"      
# [5] "abc/34 5 5/dfr_345_dsdf_334.pdf"

在这里,我们匹配并替换所有这样的空格,使得它们前面不再有斜杠。

答案 1 :(得分:2)

您可以使用dirnamebasenamefile.path

as.list(file.path(
  dirname(unlist(my_list)),
  gsub(" ", "_", basename(unlist(my_list)))
  ))
# [[1]]
# [1] "abc/as 345/as_df.pdf"
# 
# [[2]]
# [1] "adf3344/aer4_ffsd.doc"
# 
# [[3]]
# [1] "abc/3455/dfr.xls"
# 
# [[4]]
# [1] "abc/3455/dfr_serf_dff.xls"
# 
# [[5]]
# [1] "abc/34 5 5/dfr_345_dsdf_334.pdf"

或更有效,更紧凑:

as.list(file.path(
  dirname(. <- unlist(my_list)),
  gsub(" ", "_", basename(.))
))

答案 2 :(得分:1)

这是一个想法。首先,以斜杠分隔:

l2 <- strsplit(unlist(my_list), "/")
l2
# [[1]]
# [1] "abc"       "as 345"    "as df.pdf"
# [[2]]
# [1] "adf3344"       "aer4 ffsd.doc"
# [[3]]
# [1] "abc"     "3455"    "dfr.xls"
# [[4]]
# [1] "abc"              "3455"             "dfr serf_dff.xls"
# [[5]]
# [1] "abc"                  "34 5 5"               "dfr 345 dsdf 334.pdf"

现在,我们仅对每个拆分字符串的最后一个元素执行gsub,并用斜杠重新组合:

mapply(function(a,i) paste(c(a[-i], gsub(" ", "_", a[i])), collapse="/"),
       l2, lengths(l2), SIMPLIFY=FALSE)
# [[1]]
# [1] "abc/as 345/as_df.pdf"
# [[2]]
# [1] "adf3344/aer4_ffsd.doc"
# [[3]]
# [1] "abc/3455/dfr.xls"
# [[4]]
# [1] "abc/3455/dfr_serf_dff.xls"
# [[5]]
# [1] "abc/34 5 5/dfr_345_dsdf_334.pdf"

答案 3 :(得分:1)

这是使用gsubfn软件包的解决方案。 您可以使用正则表达式(/[^/]+)$查找最后一个斜杠之后的内容,然后使用将空格转换为下划线的函数来编辑该内容。

library(gsubfn)

change_space_to_underscore <- function(x) gsub(x = x, pattern = "[[:space:]]+", replacement = "_")

gsubfn(x = my_list,
       pattern = "(/[^/]+)$",
       replacement = change_space_to_underscore)