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) зависит от конкретного расширения файла.

2 ответа

Решение

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

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",

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

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

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

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

Другие вопросы по тегам