【问题标题】:How to replace space with "_" after last slash in a string with R如何在带有R的字符串中的最后一个斜杠之后用“_”替换空格
【发布时间】:2018-11-08 19:04:24
【问题描述】:

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

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), 其中模式将是一个正则表达式,它会说:匹配最后一个斜杠之后的每个空格(列表的每个元素中至少有一个斜杠)。

【问题讨论】:

  • 试试lapply(strsplit(unlist(my_list), "[/]"), function(x) paste(paste(x[-length(x)], collapse="/"), gsub(" ", "_", x[length(x)]), collapse="/"))

标签: r regex


【解决方案1】:

您可以使用负前瞻:

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"

在这里,我们匹配并替换所有前面没有斜杠的空格。

【讨论】:

    【解决方案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(.))
    ))
    

    【讨论】:

    • 我最终使用了@Julius Vainora 的答案,但真的很喜欢你的解决方案。我喜欢你使用 file.path 和 dirname 的方式。非常聪明。谢谢你。将来可能会在其他情况下使用它。
    【解决方案3】:

    这是一个想法。一、用斜线分割:

    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"
    

    【讨论】:

      【解决方案4】:

      这是一个使用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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 2016-12-18
        • 2016-05-27
        • 2016-07-10
        • 2021-09-14
        • 1970-01-01
        相关资源
        最近更新 更多