Gre*_*egS 6 regex string r bioinformatics
我的问题是我需要在字符串中找到一个位置,其中我有一些字符块,它们实际上应该只是一个字符位置.我正在使用核苷酸序列,我需要跟踪序列中的位置,但我有一些位置,其中有变体已被表示为[A/T],其中A或T可能存在,具体取决于哪个序列我关心(这是两个相似的DNA序列,它们在整个序列的几个位置上变化).因此,对于这些变体网站中的每一个,序列的长度是额外的四个字符/位置更长.
我知道我可以通过制作一个新的代码来解决这个问题,其中[A/T]可以转换为,例如X和[T/A]由Y表示,但这会让人感到困惑,因为已经有一个标准的简并代码,但是它不会跟踪哪个核苷酸来自哪个菌株(对于我来说,/来自菌株A的菌株和/来自菌株B的核苷酸之后).我想以某种方式索引这个DNA序列字符串,我在想这样:
如果我有一个像这样的字符串:
dna <- "ATC[A/T]G[G/C]ATTACAATCG"
Run Code Online (Sandbox Code Playgroud)
我想得到一个表/ data.frame:
pos nuc
1 A
2 T
3 C
4 [A/T]
5 G
6 [G/C]
... and so on
Run Code Online (Sandbox Code Playgroud)
如果我更了解正则表达式,我觉得我可以用某种方式使用strplit.我可以插入一个条件来分割每个字符,除非用方括号绑定,它应该作为一个块保存吗?
library('stringr')
df <- as.data.frame(strsplit(gsub("\\[./.\\]", '_', dna), ''), stringsAsFactors=F)
df[,1][df[,1] == '_'] <- str_extract_all(dna, "\\[./.\\]")[[1]];names(df) <- 'nuc'
df
# nuc
# 1 A
# 2 T
# 3 C
# 4 [A/T]
# 5 G
# 6 [G/C]
# 7 A
# 8 T
# 9 T
# 10 A
# 11 C
# 12 A
# 13 A
# 14 T
# 15 C
# 16 G
Run Code Online (Sandbox Code Playgroud)
我是那种喜欢保持简单的人,这是一个简短的伎俩 ...
x <- 'ATC[A/T]G[G/C]ATTACAATCG'
data.frame(nuc = regmatches(x, gregexpr('\\[[^]]*]|.', x))[[1]])
# nuc
# 1 A
# 2 T
# 3 C
# 4 [A/T]
# 5 G
# 6 [G/C]
# 7 A
# 8 T
# 9 T
# 10 A
# 11 C
# 12 A
# 13 A
# 14 T
# 15 C
# 16 G
Run Code Online (Sandbox Code Playgroud)
上面的正则表达式使用交替,在左侧我们匹配方括号内的子串,在右侧我们使用.匹配任何单个字符.