提取除 stringr 之外的所有内容

Ale*_*lex 1 stringr

我有以下文件的列表

a_file.csv another_file.csv a_third_file.csv

我想编写一个函数,该函数paste仅包含之前的文本_file.csv,因此上面的字符串将是。

a another a_third

我怎样才能做到这一点stringr

dpp*_*dan 5

\n只是因为您明确要求,所以这是一个str_extract_all()解决方案。您需要使用所谓的 \xe2\x80\x9c正向前瞻\xe2\x80\x9d。

\n\n
library(stringr)\n\nx <- c("a_file.csv", "another_file.csv", "a_third_file.csv")\n\nstr_extract_all(x, regex(".*(?=_file.csv)"))\n#> [[1]]\n#> [1] "a" "" \n#> \n#> [[2]]\n#> [1] "another" ""       \n#> \n#> [[3]]\n#> [1] "a_third" ""\n
Run Code Online (Sandbox Code Playgroud)\n\n

@Joel\xe2\x80\x99s 答案,即str_split,当然更简洁,也更快。我在这里使用fixed(),因为我们匹配的是固定字符串,而不是正则表达式。

\n\n
str_split(x, fixed("_file.csv"))\n#> [[1]]\n#> [1] "a" "" \n#> \n#> [[2]]\n#> [1] "another" ""       \n#> \n#> [[3]]\n#> [1] "a_third" ""\n
Run Code Online (Sandbox Code Playgroud)\n\n

utils::strsplit()当然,base R 或者更确切地说 the也可以做到这一点,但请注意空字符串消失了。

\n\n
strsplit(x, "_file.csv", fixed = TRUE)\n#> [[1]]\n#> [1] "a"\n#> \n#> [[2]]\n#> [1] "another"\n#> \n#> [[3]]\n#> [1] "a_third"\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我看来,单个字符向量作为返回值更加简洁。三种选择:

\n\n
    \n
  1. str_extract()具有积极的前瞻性。
  2. \n
\n\n\n\n
str_extract(x, regex(".*(?=_file.csv)"))\n#> [1] "a"       "another" "a_third"\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 您还可以替换/删除您不想要的字符串,而不是提取所需的字符串。\xe2\x80\x99。
  2. \n
\n\n\n\n
str_replace(x, fixed("_file.csv"), "")\n#> [1] "a"       "another" "a_third"\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 与相同的策略base::gsub()
  2. \n
\n\n\n\n
gsub("_file.csv", "", x, fixed = TRUE)\n#> [1] "a"       "another" "a_third"\n
Run Code Online (Sandbox Code Playgroud)\n