我想将其转换为
AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1
对此:
ELA-3
我尝试了此功能:
str_extract(.,pattern = ":?(ELA).*(\\d\\-)"))
它打印了这个:
"ELA-NH-COMBINED-3-"
我需要删除两个摘录之间的文字或其他内容。该数字将是3到9之间的数字。如何修改pattern =
中的表达式?
谢谢!
答案 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)
您无法通过一次调用str_extract
来做到这一点,因为您在单个匹配操作中无法匹配文本的不连续部分。
同样,不可能将与其他文本分开的文本匹配为一组。
有两种解决方案:
match
+ join
) 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