根据规则从字符串中提取字符(重复的连字符)

时间:2018-12-21 09:59:39

标签: r regex string substring extract

我有一个很大的数据框,其中的列看起来像这样:

var <- c("150507-001-0000001", "KMD070515-2-0000001", 
"15144KMD01AA-0000001", "Z75Z151222-0000001")

我想做的是提取字符串的一部分。我希望所有字符直到第二个连字符。所以这就是我所需要的:

150507-001
KMD070515-2 
15144KMD01AA-0000001
Z75Z151222-0000001

所以我知道我是否只想在连字符之前输入数据,我会这样做:

> var <- sub("-.*", "", var)

> var

150507
KMD070515 
15144KMD01AA
Z75Z151222

我还尝试了一个软件包 qdap ,该软件包有点给了我我想要的东西:

library("qdap")
var <- beg2char(var, "-", 2)

我确实获得了上一代码所需要的列,但是似乎有些错误。因为当我基于列执行left_join时,它不起作用。我可以在数据视图中通过复制粘贴找到匹配项,但是left_join找不到任何内容。但是,用sub制成的var进行leftjoin(见上文)即可。但是对于我的某些行,我需要第一个连字符(第二个连字符)之后的字符来找到匹配项。

2 个答案:

答案 0 :(得分:2)

我们可以使用sub来匹配非-的字符模式,然后匹配-和非-的另一组字符,捕获为一个组((...))并替换为捕获组的后向引用(\\1

sub("^([^-]+-[^-]+).*", "\\1", var)
#[1] "150507-001"           "KMD070515-2"         
#[3]  "15144KMD01AA-0000001" "Z75Z151222-0000001"  

答案 1 :(得分:2)

对于那些可能感兴趣的人,这里是一个非正则表达式解决方案:

x <- "150507-001-0000001"
paste(strsplit(x, "-")[[1]][1:2], collapse="-")

[1] "150507-001"

如果您想将此逻辑应用于整个矢量,请使用:

sapply(var, function(x) paste(strsplit(x, "-")[[1]][1:2], collapse="-"))