使用grepl在R中提取子字符串

aja*_*000 8 string substring r dataframe

我有一个表格,其字符串列格式如下

abcdWorkstart.csv
abcdWorkcomplete.csv
Run Code Online (Sandbox Code Playgroud)

我想提取该文件名中的最后一个字.所以我认为开始模式是"工作"这个词,结束模式是".csv".我用grepl写了一些东西,但没有用.

grepl("Work{*}.csv", data$filename)
Run Code Online (Sandbox Code Playgroud)

基本上我想提取Work和.csv之间的任何东西

期望的结果:

start
complete
Run Code Online (Sandbox Code Playgroud)

r2e*_*ans 9

我认为你需要subgsub(替换/提取)而不是grepl(找到匹配是否存在).请注意,如果未找到,它将返回未修改的整个字符串:

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

您可以通过过滤掉未更改的内容来解决此问题:

out[ out != fn ]
# [1] "start"    "complete"
Run Code Online (Sandbox Code Playgroud)

或者用NA(或其他)标记它们无效:

out[ out == fn ] <- NA
out
# [1] "start"    "complete" NA        
Run Code Online (Sandbox Code Playgroud)


avi*_*seR 7

随着str_extractstringr.这使用正面外观在"工作"和".csv"之间匹配任何字符一次或多次(.+):

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

library(stringr)
str_extract(x, "(?<=Work).+(?=\\.csv)")
# [1] "start"    "complete"
Run Code Online (Sandbox Code Playgroud)


And*_*ico 5

作为替代方式,删除您不想要的所有内容.

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

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

请注意:我必须使用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)
Run Code Online (Sandbox Code Playgroud)

.\n使用R引擎时也匹配.


akr*_*run 5

这是一个使用regmatches/regexprfrom的选项base R。使用正则表达式查找匹配所有不是.字符串 'Work' 之后的字符,提取regmatches

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

数据

v1 <- c('abcdWorkstart.csv', 'abcdWorkcomplete.csv', 'abcdNothing.csv')
Run Code Online (Sandbox Code Playgroud)