2

我是使用正则表达式的新手。我有以下内容:

  files = c("apple_2014_10_17.csv",
          "apple_2014_10_18.csv",
          "applepie_2014_10_17.csv",
          "applepie_2014_10_18.csv")

希望返回:

apple_2014_10_17.csv
apple_2014_10_18.csv

并且返回:

applepie_2014_10_17.csv
applepie_2014_10_18.csv

我正在使用以下正则表达式

grepl("apple_*", files)

但它会返回所有文件。任何帮助将不胜感激。

4

2 回答 2

5

您可以简单地删除*量词。问题是这个量词意味着“零次或多次”,并且apple无论您是否有下划线,都将匹配所有向量元素。

files[grepl('apple_', files)]
# [1] "apple_2014_10_17.csv" "apple_2014_10_18.csv"

或者您可以保留量词并.在其前面放置一个点。这种方式apple_是逐字匹配的,然后前面的标记(. 任何单个字符)被匹配“零次或多次”次。

files[grepl('apple_.*', files)]
# [1] "apple_2014_10_17.csv" "apple_2014_10_18.csv"
于 2014-10-20T19:06:19.323 回答
1

您也可以使用value参数 ingrep而不必 subset files。(and )的fixed参数将使匹配精确,并且由于这不会通过正则表达式引擎,因此通常会使其更快。grepgrepl

grep("apple_", files, value = TRUE, fixed = TRUE)
# [1] "apple_2014_10_17.csv" "apple_2014_10_18.csv"

或者更简单的可能是使用invert参数并搜索“pie”,返回相反的匹配项。

grep("pie", files, value = TRUE, invert = TRUE)
# [1] "apple_2014_10_17.csv" "apple_2014_10_18.csv"

请注意,如果您正在搜索目录中的文件,您也可以尝试

list.files(pattern = "apple_")
于 2014-10-20T19:20:00.950 回答