2013-02-25 3 views
16

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

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"]) 

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

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

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

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

ответ

33

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

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

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

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

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

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

+0

Интересный подход. Для меня этот подход более ясен, чем регулярное выражение, которое в настоящее время немного запутывает для меня. Я попробую. – Docuemada

+0

Это сработало хорошо, спасибо. Это имеет больше смысла для меня, но это, вероятно, потому, что мне нужно больше практики с регулярным выражением! – Docuemada

+0

@Docuemada, без проблем. Как показано, 'file_path_sans_ext' является основным регулярным выражением, поскольку я подозреваю, что' basename' (но не проверен для проверки). – A5C1D2H2I1M1N2O1R2T1

9

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

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

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

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

+1

Возможно, вам нужно использовать 'as.character' вокруг' df $ fileNames', если он был прочитан как фактор, как в приведенных примерах данных. – A5C1D2H2I1M1N2O1R2T1

+0

@ Ананда Отредактировано, спасибо. – QkuCeHBH

+0

Спасибо, и спасибо за объяснение символов регулярного выражения. Это хорошо работает. В этом примере я использовал ... as.character (df $ fileNames). – Docuemada

 Смежные вопросы

  • Нет связанных вопросов^_^