[英]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.