【问题标题】:R - select a regular expressionR - 选择一个正则表达式
【发布时间】:2021-04-15 16:20:18
【问题描述】:

我想选择我们可以找到表达式“X01”或“X02”的每一行:

dataEx <- data.frame(code = c("X01-X043","X034","X024","X015-X036-X033","X012","X015-X042","X019","X036","X022-X043"),res = NA )
pat1 <- c("(^|-)X01($|-|.)","(^|-)X02($|-|.)")
dataEx$res[grep(paste(pat1,collapse="|"),dataEx$code)] <- "ok"

它可以正常工作并给我结果:

            code  res
1       X01-X043   ok
2           X034 <NA>
3           X024   ok
4 X015-X036-X033   ok
5           X012   ok
6      X015-X042   ok
7           X019   ok
8           X036 <NA>
9      X022-X043   ok

但我想知道找到了哪种模式:

            code  res
1       X01-X043   X01
2           X034 <NA>
3           X024   X024
4 X015-X036-X033   X015
5           X012   X012
6      X015-X042   X015
7           X019   X019
8           X036 <NA>
9      X022-X043   X022

我对正则表达式很陌生。有简单的方法吗? (实际上,“pat1”要长得多,我正在寻找 20 种不同的模式)

【问题讨论】:

    标签: r regex


    【解决方案1】:

    你可以这样使用str_extract

    library(stringr)
    dataEx$res <- str_extract(dataEx$code, "X0(1|2)\\d?")
    

    在这里,我们希望匹配文字 X0,后跟 1OR 2,后跟另一个可选的 digit。

    结果:

    dataEx
                code  res
    1       X01-X043  X01
    2           X034 <NA>
    3           X024 X024
    4 X015-X036-X033 X015
    5           X012 X012
    6      X015-X042 X015
    7           X019 X019
    8           X036 <NA>
    9      X022-X043 X022
    

    【讨论】:

      【解决方案2】:

      您愿意使用 stringr 包吗?我同意 Jaskeil 的观点,我更喜欢 data.table 而不是 data.frame,但这主要是为了提高执行速度。不确定这是否会影响您的应用程序。

      library(stringr)
      dataEx <- data.frame(code = c("X01-X043","X034","X024","X015-X036-X033","X012","X015-X042","X019","X036","X022-X043"),res = NA )
      dataEx$res <- str_extract(dataEx$code, "((^|-)X01($|-|.))|((^|-)X02($|-|.))")
      

      【讨论】:

        【解决方案3】:

        你可以这样做:

        a <- regmatches(dataEx$code, gregexpr(paste(pat1, collapse = "|"), dataEx$code))
        is.na(a)<-lengths(a)==0
        
        dataEx$res <- unlist(a)
        

        但问题是,如果一行中有多个匹配项怎么办?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-18
          • 1970-01-01
          • 2011-10-01
          • 1970-01-01
          • 2018-11-29
          • 1970-01-01
          • 2015-01-11
          相关资源
          最近更新 更多