繁体   English   中英

R 中的正则表达式,匹配字符串

[英]Regex in R, matching strings

我有这样的字符串:“X96HE6.10nMBI_1_2”、“X96HE6.10nMBI_2_2”、“X96HE6.10nMBI_3_2”,我只想匹配下划线之间的数字 1、2 和 3,但没有它们(下划线)。 我能想出的最佳解决方案是str_match(sample_names, "_+[1-3]?")我非常感谢您的帮助。

最简单的方法是使用sub和反向引用:

数据:

d <- c("X96HE6.10nMBI_1_2", "X96HE6.10nMBI_2_2", "X96HE6.10nMBI_3_2")

解决方案:

sub(".*_(\\d)_.*", "\\1", d)

在这里, (\\d)定义了单个数字的捕获组(如果所讨论的数字可以多于一位,请使用\\d+ ),它被sub s 替换参数中的反向引用\\1 “召回”

或者使用str_extract和正向环视:

library(stringr)
str_extract(d, "(?<=_)\\d(?=_)")

(?<=_)是积极的向后看,可以被修饰为“如果你在左边看到_

\\d是要匹配的数字

(?=_)是积极的前瞻,它可以被表述为“如果你在右边看到_

结果:

[1] "1" "2" "3"

你可以使用 Look Arounds,我个人非常依赖 stringr Cheatsheets 来处理这些正则表达式,语法有点难记,这里是Cheatsheets 的 rstudio 页面寻找 stringr -> LOOK AROUNDS

library(tidyverse)

codes <- c("X96HE6.10nMBI_1_2", "X96HE6.10nMBI_2_2", "X96HE6.10nMBI_3_2")

codes %>%
  str_extract("(?<=_)[:digit:]+(?=_)")
#> [1] "1" "2" "3"

代表 package (v0.3.0) 于 2020 年 6 月 14 日创建

无需任何第三方模块:

strings <- c("X96HE6.10nMBI_1_2", "X96HE6.10nMBI_2_2", "X96HE6.10nMBI_3_2")
pattern <- "(?<=_)(\\d+)(?=_)"

unlist(regmatches(strings, gregexpr(pattern, strings, perl = TRUE)))

产生:

[1] "1" "2" "3"

在最后的注释中使用x ,使用read.table读取它并选择第二个字段。 不使用包或正则表达式。

read.table(text = x, sep = "_")[[2]]
## [1] 1 2 3

笔记

x <- c("X96HE6.10nMBI_1_2", "X96HE6.10nMBI_2_2", "X96HE6.10nMBI_3_2")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM