R中的str_extract表达式

时间:2019-06-30 18:22:56

标签: r regex string expression stringr

我想将其转换为

AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1

对此:

ELA-3

我尝试了此功能:

str_extract(.,pattern = ":?(ELA).*(\\d\\-)"))

它打印了这个:

"ELA-NH-COMBINED-3-"

我需要删除两个摘录之间的文字或其他内容。该数字将是3到9之间的数字。如何修改pattern =中的表达式? 谢谢!

2 个答案:

答案 0 :(得分:3)

1)匹配所有内容,最多-ELA,然后匹配所有内容(.*,最高匹配-,后跟捕获的数字(\\d+),然后是-后跟任何东西,然后用ELA-替换后跟捕获的数字。不使用任何包。

x <- "AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1"
sub(".*-ELA.*-(\\d+)-.*", "ELA-\\1", x)
## [1] "ELA-3"

2)如果只有一个数字字段,则另一种方法是我们可以读取这些字段,grep出数字字段并以ELA-开头。不使用任何软件包。

s <- scan(text = x, what = "", quiet = TRUE, sep = "-")
paste("ELA", grep("^\\d+$", s, value = TRUE), sep = "-")
## [1] "ELA-3"

答案 1 :(得分:1)

TL; DR;

您无法通过一次调用str_extract来做到这一点,因为您在单个匹配操作中无法匹配文本的不连续部分

同样,不可能将与其他文本分开的文本匹配为一组

解决方法/解决方案

有两种解决方案:

  • 捕获所需文本的一部分,然后将其合并(2个操作: match + join
  • 捕获所需的文本部分,然后用backreferences替换为所需的组(1个 replace 操作)

Capturing groups仅将您匹配的部分文本保存在单独的内存缓冲区中,但是您还需要一种能够访问这些块的方法或函数。

此处,在R中,str_extract会丢弃它们,而str_match会将它们保留在结果中。

s <- "AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1"
m <- str_match(s, ":?(ELA).*-(\\d+)") 
paste0(m[,2], "-", m[,3])

这将打印ELA-3。参见R demo online

另一种方法是在捕获需要保留的零件时进行替换,然后在替换模式中对这些零件使用反向引用:

x <- "AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1"
sub("^.*-ELA.*?-([^-]+)-[^-]+$", "ELA-\\1", x)

请参见this R demo