我有一个包含以下元素的向量:
myvec<- c("output.chr10.recalibrated", "output.chr11.recalibrated",
"output.chrY.recalibrated")
我希望在chr
之后和.recalibrated
之前有选择地提取值,然后获取result
。
结果:
10, 11, Y
答案 0 :(得分:7)
您只需sub
:
> sub(".*?chr(.*?)\\.recalibrated.*", "\\1", myvec)
[1] "10" "11" "Y"
模式匹配第一个chr
之前的任何符号,然后匹配并捕获第一个.recalibrated
之前的任何字符,然后匹配其余字符。在替换模式中,我们使用反向引用\1
将所需的捕获值插入到结果字符串中。
请参阅regex demo
作为替代方案,请使用str_match
:
> library(stringr)
> str_match(myvec, "chr(.*?)\\.recalibrated")[,2]
[1] "10" "11" "Y"
它保留了所有捕获的值,并有助于避免str_extract
中必需的模式中昂贵的非锚定外观。
模式意味着:
chr
- 匹配一系列文字字符chr
(.*?)
- 匹配换行符以外的任何字符(如果您还需要匹配换行符,请在模式的开头添加(?s)
)直到第一个\\.recalibrated
- .recalibrated
文字字符序列。答案 1 :(得分:3)
如果whatever.chr10.whateverelse.recalibrated
输入略有不同,这两个答案都会失败,这里我的方法只有sub
的正则表达式部分不同:
sub(".*[.]chr([^.]*)[.].*", "\\1", myvec)
正则表达式的作用是:
.*[.]chr
尽可能匹配,直到找到'.chr'veliraly ([^.]*)
捕获所有内容,而不是chr之后的一个点(可以被\\d+
替换为仅捕获数字值,需要至少一个数字[.].*
匹配文字点后面的其余部分我更喜欢反斜杠转义([.]
)上的点(\\.
)的字符类转义,因为当你回到正则表达式时它通常更容易阅读,这是我的意见而不是被我所知道的任何最佳实践所涵盖。
答案 2 :(得分:2)
我们可以使用str_extract
来执行此操作。我们匹配其他一个字符(.*
),后面跟着&#39; chr&#39; ((?<=chr)
)和.recalibrated
((?=\\.recalibrated)
)之前。
library(stringr)
str_extract(myvec, "(?<=chr).*(?=\\.recalibrated)")
#[1] "10" "11" "Y"
或者使用gsub
来匹配从chr
开始的|
或(.recalibrated
)到字符串结尾($
)的字符和将其替换为''
。
gsub(".*\\.chr|\\.recalibrated.*$", "", myvec)
#[1] "10" "11" "Y"
答案 3 :(得分:0)
看起来像XY问题。为何提取?如果在进一步的分析步骤中需要这样做,我们可以例如这样做:
for(chrN in c(1:22, "X", "Y")) {
myVar <- paste0("output.chr", chrN, ".recalibrated")
#do some fun stuff with myVar
print(myVar)
}