Извлечь подстроку в R, используя grepl - PullRequest
0 голосов
/ 28 августа 2018

У меня есть таблица со строковым столбцом, отформатированным следующим образом

abcdWorkstart.csv
abcdWorkcomplete.csv

И я хотел бы извлечь последнее слово в этом имени файла. Поэтому я думаю, что начальным шаблоном будет слово «Работа», а конечным шаблоном будет «.csv». Я написал что-то с использованием grepl, но не работает.

grepl("Work{*}.csv", data$filename)

По сути, я хочу извлечь что-нибудь между Work и .csv

желаемый результат:

start
complete

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Здесь можно использовать regmatches/regexpr из base R. Используя регулярное выражение для соответствия всем символам, которые не являются . после строки «Работа», извлеките с помощью regmatches

regmatches(v1, regexpr("(?<=Work)[^.]+(?=[.]csv)", v1, perl = TRUE))
#[1] "start"    "complete"

данные

v1 <- c('abcdWorkstart.csv', 'abcdWorkcomplete.csv', 'abcdNothing.csv')
0 голосов
/ 28 августа 2018

С str_extract от stringr. При этом используются положительные обходные пути для соответствия любого символа один или несколько раз (. +) Между «Work» и «.csv»:

x <- c("abcdWorkstart.csv", "abcdWorkcomplete.csv")

library(stringr)
str_extract(x, "(?<=Work).+(?=\\.csv)")
# [1] "start"    "complete"
0 голосов
/ 28 августа 2018

Как альтернативный способ, удалите все, что вам не нужно.

x <- c("abcdWorkstart.csv", "abcdWorkcomplete.csv")

gsub("^.*Work|\\.csv$", "", x)
#[1] "start"    "complete"

пожалуйста, обратите внимание: Я должен использовать gsub. Потому что сначала я удаляю ^.*Work, а затем \\.csv$.


Для [\\s\\S] или \\d\\D ... (не работает с [g]? Sub)

https://regex101.com/r/wFgkgG/1

Работает с подходом akruns:

regmatches(v1, regexpr("(?<=Work)[\\s\\S]+(?=[.]csv)", v1, perl = T))

str1<-
'12
.2
12'

gsub("[^.]","m",str1,perl=T)
gsub(".","m",str1,perl=T)
gsub(".","m",str1,perl=F)

. также соответствует \n при использовании двигателя R.

0 голосов
/ 28 августа 2018

Я думаю, вам нужно sub или gsub (заменить / извлечь) вместо grepl (найти, если совпадение существует). Обратите внимание, что когда он не найден, он вернет всю строку без изменений:

fn <- c('abcdWorkstart.csv', 'abcdWorkcomplete.csv', 'abcdNothing.csv')
out <- sub(".*Work(.*)\\.csv$", "\\1", fn)
out
# [1] "start"           "complete"        "abcdNothing.csv"

Вы можете обойти это, отфильтровав неизмененные:

out[ out != fn ]
# [1] "start"    "complete"

Или пометить их как недействительные NA (или что-то еще):

out[ out == fn ] <- NA
out
# [1] "start"    "complete" NA        
...