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)
我认为你需要sub或gsub(替换/提取)而不是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)
随着str_extract从stringr.这使用正面外观在"工作"和".csv"之间匹配任何字符一次或多次(.+):
x <- c("abcdWorkstart.csv", "abcdWorkcomplete.csv")
library(stringr)
str_extract(x, "(?<=Work).+(?=\\.csv)")
# [1] "start" "complete"
Run Code Online (Sandbox Code Playgroud)
作为替代方式,删除您不想要的所有内容.
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引擎时也匹配.
这是一个使用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)