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

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

 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 , потому что расширение файла может появляться только один раз для каждого имени файла. Кроме того, вы должны использовать \\. который соответствует точке вместо . который соответствует любому символу. Наконец, вы должны добавить $ к шаблону, чтобы убедиться, что вы удаляете расширение только в том случае, если оно находится в конце имени файла.

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

  • Как искать в PDF-файлах с использованием регулярных выражений?
  • Regex.Match целые слова
  • Выключение прямой косой черты в регулярном выражении
  • Регулярное выражение \ p {L} и \ p {N}
  • Формат ввода формы HTML5 Формат валюты
  • Regex, который будет соответствовать декларации Java-метода
  • Как создать совпадение регулярных выражений?
  • Инструмент Grep для XML
  • Regex для строки с кавычками
  • Что такое регулярное выражение для parsingа отдельных предложений?
  • Как использовать замену новой строки в BSD sed?
  • Давайте будем гением компьютера.