Регулярные выражения, stringr - имеют регулярное выражение, не могут заставить его работать в R - PullRequest
0 голосов
/ 24 января 2019

У меня есть фрейм данных с полем с именем "full.path.name" Это содержит такие вещи, как s: /// 01 GROUP / 01 SUBGROUP / ~ $ имя документа имеет пробел. docx

01 GROUP - это шаблон переменного размера во всей строке.

Я хотел бы добавить новое поле во фрейм данных с именем "short.path" и он будет содержать такие вещи, как

с: /// 01 ГРУППА

s: /// 02 GROUP LONGER NAME

Мне удалось извлечь последние четыре символа файла с помощью stringr, я думаю, что мне следует снова использовать stringr.

Это дает мне расширение файла

sfiles$file_type<-as.factor(str_sub(sfiles$Type.of.file,-4))

Я пошел к https://www.regextester.com/ и получил это

 s:///*.[^/]*

в качестве регулярного выражения для использования поэтому я попробовал это ниже

sfiles$file_path_short<-as.factor(str_match(sfiles$Full.path.name,regex("s:///*.[^/]*")))

Я думал, что получу новое поле в моем фрейме данных, содержащее 01 группа и т. Д. Я получаю NA

Когда я пытаюсь это

sfiles$file_path_short<-str_extract(sfiles$Full.path.name,"[S]")

дает мне S

Куда я иду не так? Когда я использую: https://regexr.com/ я получил \ d * [A-Z] * [A-Z] * [^ /]

Как мне вставить это в

sfiles$file_path_short<-str_extract(sfiles$Full.path.name,\d* [A-Z]* [A-Z]*[^\/])

И заставить все работать?

EDIT: Здесь есть два решения. Сначала решения не работали, потому что

  sfiles$Full.path.name 

было> 255 в некоторых случаях.

Что я сделал: Чтобы заставить регулярное выражение g_t_m работать

 library(tidyverse)
 #read the file
 sfiles1<-read.csv("H:/sdrive_files.csv", stringsAsFactors = F)

 # add a field to calculate path length and filter out
 sfiles$file_path_length <- str_length(sfiles$Full.path.name)
 sfiles<-sfiles%>%filter(file_path_length <=255)

 # then use str_replace to take out the full path name and leave only the 
   top 
 # folder names

 sfiles$file_path_short <- as.factor(str_replace(sfiles$Full.path.name, " 
 (^.+?/[^/]+?)/.+$", "\\1"))
 levels(sfiles$file_path_short)

[1] "S: /// 01 ГРУППА 1"
[2] "S: /// 02 ГРУППА 2"
[3] "S: /// 03 ГРУППА 3"
[4] "S: /// 04 ГРУППА 4"
[5] "S: /// 05 ГРУППА 5"
[6] "S: /// 06 ГРУППА 6"
[7] "S: /// 07 ГРУППА 7

Я думаю, что это поле full.path.name вызывало проблемы. Чтобы заставить ответ Виктора работать, я сделал это:

#read the file
sfiles<-read.csv("H:/sdrive_files.csv", stringsAsFactors = F)
str(sfiles)       
sfiles$file_path_length <- str_length(sfiles$Full.path.name)
sfiles<-sfiles%>%filter(file_path_length <=255)
sfiles$file_path_short <- str_replace(sfiles$Full.path.name, " 
(^.+?/[^/]+?)/.+$", "\\1")

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы можете использовать просто

sfiles$file_path_short <- str_extract(sfiles$Full.path.name, "^s:///[^/]+")

Если вы планируете исключить s:/// из результатов, оберните его положительным взглядом:

"(?<=^s:///)[^/]+"

См. Демоверсию regex

Детали

  • ^ - начало строки
  • s:/// - буквальная подстрока
  • [^/]+ - класс отрицательных символов, соответствующий любым 1+ символам, кроме /.
  • (?<=^s:///) - положительный взгляд сзади, который требует присутствия s:/// в начале строки непосредственно слева от текущего местоположения (но это значение не появляется в результирующих совпадениях, так как обходные пути являются непотребляющими шаблонами ).
0 голосов
/ 24 января 2019

Во-первых, я бы изменил ваше регулярное выражение для извлечения расширения файла, поскольку расширения файла не всегда имеют длину 4 символа:

library(stringr)

df <- data.frame(full.path.name = c("s:///01 GROUP/01 SUBGROUP/~$ document name has spaces.docx",
                                    "s:///01 GROUP/01 SUBGROUP/~$ document name has spaces.pdf"), stringsAsFactors = F)

df$file_type <- str_replace(basename(df$full.path.name), "^.+\\.(.+)$", "\\1")

df$file_type
[1] "docx" "pdf" 

Затем следующий код должен дать вам ваше короткое имя:

df$file_path_short <- str_replace(df$full.path.name, "(^.+?/[^/]+?)/.+$", "\\1")

df
                                              full.path.name file_type file_path_short
1 s:///01 GROUP/01 SUBGROUP/~$ document name has spaces.docx      docx   s:///01 GROUP
2  s:///01 GROUP/01 SUBGROUP/~$ document name has spaces.pdf       pdf   s:///01 GROUP
...