Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用正则表达式按行提取字符串?_R_Regex_Dplyr - Fatal编程技术网

R 如何使用正则表达式按行提取字符串?

R 如何使用正则表达式按行提取字符串?,r,regex,dplyr,R,Regex,Dplyr,我在数据框中有一列文件名,如下所示: /testData/THQ/TAIRATE.20030314.190000.tif /testData/THQ/TAIRATE.20030314.200000.tif /testData/THQ/TAIRATE.20030314.210000.tif /testData/THQ/TAIRATE.20030314.220000.tif 我想从中提取时间戳,并将其存储为另一列。但我不熟悉正则表达式。到目前为止,我已经做到了: tdat %>% dpl

我在数据框中有一列
文件名
,如下所示:

/testData/THQ/TAIRATE.20030314.190000.tif
/testData/THQ/TAIRATE.20030314.200000.tif
/testData/THQ/TAIRATE.20030314.210000.tif
/testData/THQ/TAIRATE.20030314.220000.tif
我想从中提取时间戳,并将其存储为另一列。但我不熟悉正则表达式。到目前为止,我已经做到了:

tdat %>%
  dplyr::rowwise() %>% 
  dplyr::mutate(timestamp = str_extract(as.character(filename), "[^//TAIRATE]+$")) %>% 
  glimpse()
结果 预期结果
问题:如何编写正确的正则表达式,或者有更好的方法吗?

str\u extract和其他此类函数都是矢量化的,您不需要按行操作

在这种情况下,可以使用
sub
在基本R中执行此操作

sub('.*TAIRATE\\.(\\d+)\\.(\\d+).*', '\\1\\2', df$filename)
#[1] "20030314190000" "20030314200000" "20030314210000" "20030314220000"

str_extract
和其他类似的函数是矢量化的,您不需要按行执行

在这种情况下,可以使用
sub
在基本R中执行此操作

sub('.*TAIRATE\\.(\\d+)\\.(\\d+).*', '\\1\\2', df$filename)
#[1] "20030314190000" "20030314200000" "20030314210000" "20030314220000"

当然没有@akrun的解决方案优雅,但这一方案也很有效:

paste0(unlist(str_extract_all(filename, "[0-9]+")), collapse = "")
数据:


filename当然不如@akrun的解决方案优雅,但这个解决方案也很有效:

paste0(unlist(str_extract_all(filename, "[0-9]+")), collapse = "")
数据:


filename Try
str_extract(as.character(filename),”(?@WiktorStribiżew谢谢!但这是删除点后的所有内容。如果
20030314
True,那么
str_replace(as.character(filename),“*TAIRATE\\(\\d+)\(\\d+).*”,“\\1\\2”)呢
?这会有一个副作用:如果没有找到匹配项,则最终整个文件名将保持不变。请尝试
str_extract(as.character(filename),“(?@WiktorStribiżew,谢谢!但这会删除点后的所有内容。如果
20030314
True,那么
str_replace(as.character(filename),“*TAIRATE\”。(\\d+)\(\\d+。*”,“\\1\\2”)
?这将产生一个副作用:如果没有找到匹配项,您将得到整个文件名不变的结果。@maximusdooku注意事项与中相同:这将产生一个副作用:如果没有找到匹配项,您将得到整个文件名unchanged@WiktorStribi谢谢你的提醒!还有,作为旁注——什么是好的r我有足够的资源来学习正则表达式,以使其发挥作用?我总是避免学习它。@maximusdooku我不知道你的正则表达式知识水平:),因此我只能建议你在上完成所有课程,通读,(还有许多其他到优秀在线资源的链接),以及所谓的社区。还有,值得一看。@maximudooku For R,另请参阅。@maximudooku与中的注释相同:这将产生一个副作用:如果没有找到匹配项,您将得到整个文件名unchanged@WiktorStribiżew感谢您的提醒!另外,作为旁注-什么是好的学习资源关于regex的知识足够让它发挥作用吗?我总是避免学习它。@maximusdooku我不知道你的regex知识水平:),所以我只能建议你在上完成所有课程,通读,(还有许多其他链接到优秀的在线资源),以及所谓的社区。另外,值得一看。@maximusdooku For R,另请参阅。
filename <- "/testData/THQ/TAIRATE.20030314.190000.tif"