Почему мои имена файлов не соответствуют моему регулярному выражению? - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь получить некоторые файлы с очень простым регулярным выражением, используя list.files.

files <- list.files('C:/filepath/...', pattern = ('split*.csv'), full.names=TRUE)

У меня есть несколько файлов в этой конкретной папке:

split1.csv
split2.csv
split3.csv
...

ЭтоКод должен работать, согласно множеству примеров, которые я видел. Но когда я запускаю его с шаблоном pattern = ('split*.csv'), я получаю пустой «список».

Однако, когда я запускаю его с pattern = ('split1.csv'),, он совпадает с файлом split1.csv.

Когда я запускаю его с шаблоном pattern = ('*.csv'), он также работает нормально: он соответствует всем разделенным файлам, но, конечно, и другим файлам csv в папке.

Итак, проблемадело не в том, что файлы не существуют в этой папке. Путь к файлу правильный, но с pattern = ('split*.csv') он не совпадает с указанными выше разделенными файлами. Это должно быть, учитывая множество примеров, которые я видел по этому поводу.

Может ли быть правда, что что-то изменилось в этой функции? Кто-нибудь знает, как фильтровать нужные файлы?

Работа с версией R версии 3.6.1.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

вы не используете правильное регулярное выражение. . - это заполнитель, который будет соответствовать каждому символу. Чтобы сопоставить действительную точку, вы должны использовать \\..

list.files('C:/filepath/...', pattern = 'split.\\.csv$', full.names=TRUE)

* на языке регулярных выражений означает ноль или более вхождений последнего символа. Следовательно, pattern = 'split*.csv' будет соответствовать любому из них: spli.csv, split.csv, splitttttt.csv, splittttttHcsv, spli9csv и т. Д.

Вы можете использовать grep для проверки своего регулярного выражения:

pos_match <- c("spli.csv", "split.csv", "splittttt.csv", "spli9csv", "splittttHcsv")
neg_match <- c("split1.csv",  "split2.csv")
grep("split*.csv", pos_match, value = T)
grep("split*.csv", neg_match, value = T)
1 голос
/ 08 ноября 2019

Это связано с вашим регулярным выражением:

a <- c('split1.csv', 'split2.csv', 'split3.csv')
grep('split.*\\.csv', a)

В R вам нужна точка (.) Перед звездочкой (*), чтобы соответствовать любому количеству символов.

И если вы хотите указать, что существует фактическая точка (как в '.csv') или любой другой символ, который не представляет свой собственный символ в регулярном выражении, вы должны указать, что вы действительно хотите, чтобы этот конкретныйсимвол, добавив перед ним '\\'.

0 голосов
/ 08 ноября 2019

Когда вы используете split *, это может означать splittttt, spli, split. Я думаю, что split [0-9] *. CSV должен помочь. Учитывая, что имена ваших файлов имеют номера после разделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...