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.