【问题标题】:Extract characters from string based on rule (repeated hyphen)根据规则从字符串中提取字符(重复连字符)
【发布时间】:2019-05-21 19:12:33
【问题描述】:

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

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 进行左连接(见上文)确实有效。但是对于我的某些行,我需要第一个连字符之后(以及第二个连字符之前)的字符来找到匹配项。

【问题讨论】:

  • 而且顺便格式化成字符也无济于事。

标签: r regex string substring extract


【解决方案1】:

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

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="-"))

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢你,这很好用!但是我的 left_join 仍然无法正常工作,所以猜测问题出在另一个地方。我会查看我的代码。
    • @LouiseSørensen 我会检查是否有前导/滞后空间。尝试使用trimws 删除那些
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2017-09-24
    • 2018-06-11
    • 1970-01-01
    • 2015-12-29
    • 2018-12-14
    • 2017-12-30
    • 2013-06-04
    相关资源
    最近更新 更多