删除所需字符串前后匹配模式的字母

时间:2016-04-21 10:24:46

标签: regex r

我有一个包含以下元素的向量:

myvec<- c("output.chr10.recalibrated", "output.chr11.recalibrated",
"output.chrY.recalibrated")

我希望在chr之后和.recalibrated之前有选择地提取值,然后获取result

结果:

10, 11, Y

4 个答案:

答案 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)
}