Regex вернуть имя файла, удалить путь и расширение файла

У меня есть data.frame, который содержит текстовый столбец имен файлов. Я хотел бы вернуть имя файла без пути или расширения файла. Как правило, имена моих файлов нумеруются, но они не обязательно должны быть. Например:

df<-data.frame(data=c("a","b"),fileNames=c("C:/a/bb/ccc/NAME1.ext","C:/a/bb/ccc/d D2/name2.ext"))

Я хотел бы вернуть эквивалент

df<-data.frame(data=c("a","b"),fileNames=c("NAME","name"))

но я не могу понять гладкое регулярное выражение, чтобы сделать это с помощью gsub. Например, я могу избавиться от расширения с (если имя файла заканчивается номером):

gsub('([0-9]).ext','',df[,"fileNames"])

Хотя я пробовал различные шаблоны (читая файлы справки regex и подобные им решения на этом сайте), я не могу получить регулярное выражение, чтобы вернуть текст между последним "/" и первым ".". Любые мысли или переходы к подобным вопросам очень ценятся!

Лучшее, что я получил, это:

 gsub('*[[:graph:]_]/|*[[:graph:]_].ext','',df[,"fileNames"])

Но это 1) не избавляет от всех символов ведущего пути и 2) зависит от конкретного расширения файла.

Ответы

Ответ 1

Возможно, это приблизит вас к вашему решению:

library(tools)
basename(file_path_sans_ext(df$fileNames))
# [1] "NAME1" "name2"

Функция file_path_sans_ext находится в пакете "tools" (который, как я полагаю, обычно приходит с R), и он будет извлекать путь до (но не включая) расширения. Функция basename затем избавится от информации о вашем пути.

Или, чтобы взять из file_path_sans_ext и немного изменить его, вы можете попробовать:

sub("(.*\\/)([^.]+)(\\.[[:alnum:]]+$)", "\\2", df$fileNames)
# [1] "NAME1" "name2"

Здесь я "захватил" все три части переменных "fileNames", поэтому, если вам нужны только пути к файлам, вы должны изменить "\\2" на "\\1", и если вы хотите только расширения файлов, вы изменили бы его на "\\3".

Ответ 2

Прежде всего, чтобы избавиться от "ведущего пути", вы можете использовать basename. Чтобы удалить расширение, вы можете использовать sub аналогично вашему описанию в своем вопросе:

filenames <- sub("\\.[[:alnum:]]+$", "", basename(as.character(df$fileNames)))

Обратите внимание: здесь вы должны использовать sub вместо gsub, потому что расширение файла может появляться только один раз для каждого имени файла. Кроме того, вы должны использовать \\., который соответствует точке вместо ., которая соответствует любому символу. Наконец, вы должны добавить $ к шаблону, чтобы убедиться, что вы удаляете расширение только в том случае, если оно находится в конце имени файла.

Изменить: функция file_path_sans_ext, предлагаемая в решении Ананды Махто, работает через sub("([^.]+)\\.[[:alnum:]]+$", "\\1", x), то есть вместо удаления расширения, как указано выше, сохраняется нерасширяющая часть имени файла. Я не вижу особых преимуществ или недостатков обоих методов в случае OP.