【问题标题】:R regex semicolonR 正则表达式分号
【发布时间】:2016-05-03 11:37:12
【问题描述】:

我想检查列表中的所有元素是否具有我需要的模式,否则我将停止整个脚本。

示例列表如下所示:

[1]
Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanobrevibacter;
[2]
Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanosphaera;
[3]
Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanosphaera;
[4]
Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;
[5]
Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;
[6]
Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;
[7]
Bacteria;Actinobacteria;Actinobacteria;Coriobacteriales;Coriobacteriaceae;Gordonibacter;
[8]
Bacteria;Actinobacteria;Coriobacteriia;Coriobacteriales;Coriobacteriaceae;;
[9]
Bacteria;Actinobacteria;Coriobacteriia;Coriobacteriales;Coriobacteriaceae;;

希望所有条目都恰好有六个分号。 我尝试使用 grepl 进行模式匹配,但我在使用正确的模式时遇到了麻烦。 这是我尝试过的

if(!any(grepl(";{6}", taxonomy))) { Through error message if the
taxonomy is not in the right format   stop("Wrong number of taxonomic
classes\n Taxonomic levels have to be separated by semicolons (six in
total).  IMPORTANT: if taxonomic information at any level is missing,
the semicolons are still needed:\n  
e.g.Bacteria;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella;
      e.g.Bacteria;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;;")
} else {

但我总是得到 FALSE。

【问题讨论】:

  • stringr包看str_count

标签: regex r grepl


【解决方案1】:

count.fields 使用sep 参数作为字段分隔符返回作为其第一个参数给出的文件或连接的每一行中的字段数。没有使用任何包。

f <- function(x) {
  ok <- count.fields(textConnection(x), sep = ";") == 7
  if (any(!ok)) stop("these row numbers do not have 7 fields: ", which(!ok))
  # add whatever other code you need
}

测试一下:

# x has 2 components having 7 and 3 semicolon-separated fields respectively
x <- c("Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanobrevibacter;", ";;")
f(x)
## Error in f(x) : these row numbers do not have 7 fields: 2

参见?count.fields?textConnection

【讨论】:

    【解决方案2】:
    ;{6}
    

    匹配";;;;;;",仅此而已。你想检查类似的东西

    (?:[^;]*;){6}
    

    如果(至少)6 个分号出现在字符串中,则匹配。

    如果你需要断言你测试的每一行有正好 6个分号,你需要更具体:

    ^(?:[^;]*;){6}[^;]*$
    

    其中^$ 是字符串anchors 的开始/结束,[^;]* 是一个否定的character class,它匹配除分号之外的任意数量的字符。

    R 代码

    > x<-c('Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanobrevibacter;',
      'Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanosphaera;',
      'Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanosphaera;',
      'Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;',
      'Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;',
      'Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;',
      'Bacteria;Actinobacteria;Actinobacteria;Coriobacteriales;Coriobacteriaceae;Gordonibacter;',
      'Bacteria;Actinobacteria;Coriobacteriia;Coriobacteriales;Coriobacteriaceae;;',
      'Bacteria;Actinobacteria;Coriobacteriia;Coriobacteriales;Coriobacteriaceae;;')
    > grepl("^(?:[^;]*;){6}[^;]*$", x)
    [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    [9] TRUE
    

    【讨论】:

    • 谢谢!你拯救了我的一天!
    【解决方案3】:

    使用stringr 你可以做类似的事情,

    library(stringr)
    which(str_count(taxonomy, ';') == 6)
    

    grepl(6, str_count(taxonomy, ';'))
    

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2022-06-16
      相关资源
      最近更新 更多