【问题标题】:Extracting and matching regular expressions in R在 R 中提取和匹配正则表达式
【发布时间】:2017-01-25 02:37:12
【问题描述】:

我有一个字符串列表,下面是一个示例(实际列表的格式种类要多得多)

[1]“AB-123”
[2] “AB-312”
[3] “AB-546”
[4]《ZXC/123456》

假设 [1] 是正确的格式,我想从 [1] 中提取正则表达式并将其与其余的匹配以检测 [4] 不一致。有没有办法做到这一点,或者有更好的方法来达到同样的结果?

*EDIT - 我发现了一些接近我需要的东西,有人知道这样做的任何包吗? Given a string, generate a regex that can parse *similar* strings

【问题讨论】:

  • "我想从 [1] 中提取正则表达式" - 你有什么想法吗?你如何定义“一致”?一样长吗? - 两侧的粗略图案相同?数字与字母比较?
  • 你需要grepl(substr(v1[1], 1, 2), v1[-1]) where v1 <- c( "AB-123" , "AB-312" , "AB-546" , "ZXC/123456")这样的东西
  • @akrun 是的,我需要这样的东西,除了 str 的格式可能并不总是以“AB”开头。这就是为什么我想从 str 中提取正则表达式而不是指定它
  • @thelatemail 我认为一致的是字符的长度、字母、数字或符号的位置。我想在分解 str - "AB-123" = [char, char, sign, num, num, num] 后得到一个类型列表?不太确定这是否可行

标签: r


【解决方案1】:

我们可能需要grep

 grepl(sub("-.*", "", v1[1]), v1[-1])

数据

v1 <- c( "AB-123" , "AB-312" ,  "AB-546" , "ZXC/123456")

【讨论】:

    【解决方案2】:

    这里尝试创建一个函数来检查每个值是Character Digit 还是Other。这有点粗糙,但我相信可以扩展它以完全匹配您想要的:

    test <- c("AB-123", "AB-312", "AB-546", "ZXC/123456")
    
    compare_1st <- function(x) {
      x <- toupper(x)
      chars <- list("A",1,"-")
      repl  <- c("[A-Z]", "[0-9]", "[^0-9A-Z]")
      for(i in seq_along(repl)) x <- gsub(repl[i], chars[i], x)
      out <- x[1] == x
      attr(out, "values") <- chartr("A1-", "CDO", x)
      out
    }
    
    compare_1st(test)
    #[1]  TRUE  TRUE  TRUE FALSE
    #attr(,"values")
    #[1] "CCODDD"     "CCODDD"     "CCODDD"     "CCCODDDDDD"
    

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      相关资源
      最近更新 更多