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 .

  • Поиск и удаление символов без ascii из Oracle Varchar2
  • Передача параметров в действие с помощью ModelDriven в Struts 2
  • Ява; String заменить (используя регулярные выражения)?
  • Вложенные круглые скобки
  • Regex для сопоставления маршрутов в Express
  • Как заменить регулярное выражение в MySQL?
  • Rsync с использованием regex для включения только некоторых файлов
  • Найти повторяющиеся фразы - любой инструмент или регулярное выражение
  • Regex: что такое InCombiningDiacriticalMarks?
  • Почему мое регулярное выражение не работает в NotePad ++?
  • Разница между std :: regex_match и std :: regex_search?
  • Interesting Posts

    Может ли сайт определить, использую AdBlock в Firefox?

    Как получить файл .pem из .key и .crt файлов?

    Как реализовать правильную обработку ошибок HTTP в .NET MVC 2?

    Почему вы используете Expression <Func >, а не Func ?

    Как я могу заставить wget переименовать загруженные файлы, чтобы не включать строку запроса?

    Xcode 6 iOS Создание Cocoa Touch Framework – проблемы с архитектурой

    Есть ли язык запросов для JSON?

    Использование функции exit ()

    Загрузка JSON с NSURLSession не возвращает никаких данных

    Как преобразовать файл .pfx в хранилище ключей с помощью закрытого ключа?

    Android Studio – локального пути не существует

    Проблемы с передачей свойств и параметров системы при запуске Java-classа через Gradle

    Расширьте объем, где впереди будет выделенное пространство

    Сортировка списка из другого идентификатора списка

    Является ли оператор monad bind (>> =) ближе к функциональному составу (цепочке) или приложению функции?

    Давайте будем гением компьютера.