首页 > 解决方案 > 在固定字符位置之前提取字符串

问题描述

这是一个相当简单的问题,我尝试了多种组合,但是我没有达到我想要实现的目标。我有一个列,其中的语句用“-”分隔。我想从四月份提取第四个“-”之前的单词。

我正在使用此代码修剪第 4 个“-”之前的部分,并返回之后剩下的任何内容。

data$newCol1 <- NA 
data$newCol1 <- ifelse(data$date >= as.Date("2019-04-01"), sub(".?-.?-.?-.?-", "", data$Email), ifelse(data$date <= as.Date("2019-03-31"),data$Email,data$newCol1))

但是我想提取第 4 个“-”之前的部分,例如,如果我的字符串“19Q1-XYZ-JA-All-OutR-random-key-March”我只想要 19Q1-XYZ-JA-All 而不是 OutR -random-key-March 这是我目前得到的

这是我的数据集

Email                                           date
18Q4-ABC-SEA-CO-TM                              1/8/2019
19Q1-DEF-ABJPODTSST                             1/16/2019
19Q1-ABC-CMJ                                    2/8/2019
19Q1-APC-CORP                                   4/9/2019
19Q1-XYZ-ALP-SEA-MOO  ABc_1                     5/13/2019
19Q1-WXY-All-SF- Coral 01_24                    1/27/2019
19Q1-XYZ-All-SF-Tokyo SF Event 03_14 FINAL Send 3/14/2019
19Q1-XYZ-CN-All-cra-foo world-2901              1/30/2019
19Q1-XYZ-CN-All-get-foo world-2901              1/31/2019
19Q1-XYZ-CN-All-opc-foo world-2901              7/31/2019
19Q1-XYX-FI-AC-DEC-kites                        1/21/2019
19Q1-XYZ-JA-All-OutR-random-key-March           7/19/2019
19Q1-XYZ-JA-All-OutR-random-key-March           6/19/2019
19Q1-XYZ-JA-SF-OutR-RFC_ABS-key-March           3/29/2019
19Q1-XYZ-unavailable-random-key-balaji          4/20/2019

标签: rsubstring

解决方案


一个选项是匹配-后面不是 a 的 3 组字符和不是( )-的下一组字符,作为一个组捕获并替换为该捕获组的反向引用 ( )-[^-]+\\1

data$date <- as.Date(data$date, "%m/%d/%Y")
data$newCol1 <- NA 
data$newCol1 <- ifelse(data$date >= as.Date("2019-04-01"), 
    sub("^(([^-]+-){3}[^-]+)-.*", "\\1", data$Email),
   ifelse(data$date <= as.Date("2019-03-31"),data$Email,data$newCol1))

数据

data <- structure(list(Email = c("18Q4-ABC-SEA-CO-TM", "19Q1-DEF-ABJPODTSST", 
"19Q1-ABC-CMJ", "19Q1-APC-CORP", "19Q1-XYZ-ALP-SEA-MOO  ABc_1", 
"19Q1-WXY-All-SF- Coral 01_24", "19Q1-XYZ-All-SF-Tokyo SF Event 03_14 FINAL Send", 
"19Q1-XYZ-CN-All-cra-foo world-2901", "19Q1-XYZ-CN-All-get-foo world-2901", 
"19Q1-XYZ-CN-All-opc-foo world-2901", "19Q1-XYX-FI-AC-DEC-kites", 
"19Q1-XYZ-JA-All-OutR-random-key-March", "19Q1-XYZ-JA-All-OutR-random-key-March", 
"19Q1-XYZ-JA-SF-OutR-RFC_ABS-key-March", "19Q1-XYZ-unavailable-random-key-balaji"
), date = c("1/8/2019", "1/16/2019", "2/8/2019", "4/9/2019", 
"5/13/2019", "1/27/2019", "3/14/2019", "1/30/2019", "1/31/2019", 
"7/31/2019", "1/21/2019", "7/19/2019", "6/19/2019", "3/29/2019", 
"4/20/2019")), class = "data.frame", row.names = c(NA, -15L))

推荐阅读