【问题标题】:Use Regular expressions extract specific characters使用正则表达式提取特定字符
【发布时间】:2020-09-25 03:21:07
【问题描述】:
text <- c('d__Viruses|f__Closteroviridae|g__Closterovirus|s__Citrus_tristeza_virus',
'd__Viruses|o__Tymovirales|f__Alphaflexiviridae|g__Mandarivirus|s__Citrus_yellow_vein_clearing_virus',
'd__Viruses|o__Ortervirales|f__Retroviridae|s__Columba_palumbus_retrovirus')

我试过但失败了:

str_extract(text, pattern = 'f.*\\|') 

我怎样才能得到

f__Closteroviridae

f__Alphaflexiviridae

f__Retroviridae

任何帮助将不胜感激!

【问题讨论】:

    标签: r regex dplyr


    【解决方案1】:

    使正则表达式不贪婪,并且由于您不希望在最终输出中出现"|",因此请使用正向前瞻。

    stringr::str_extract(text, 'f.*?(?=\\|)') 
    #[1] "f__Closteroviridae"   "f__Alphaflexiviridae" "f__Retroviridae"   
    

    在base R中,我们可以使用sub

    sub('.*(f_.*?)\\|.*', '\\1', text)
    #[1] "f__Closteroviridae"   "f__Alphaflexiviridae" "f__Retroviridae" 
    

    【讨论】:

      【解决方案2】:

      对于基本 R 解决方案,我会使用 regmatchesgregexpr

      m <- gregexpr("\\bf__[^|]+", text)
      as.character(regmatches(text, m))
      
      [1] "f__Closteroviridae"   "f__Alphaflexiviridae" "f__Retroviridae"
      

      如上使用gregexpr 的优势在于,如果输入包含更多f__ 匹配词,我们也可以捕获它。例如:

      x <- 'd__Viruses|f__Closteroviridae|g__Closterovirus|f__some_virus'
      m <- gregexpr("\\bf__[^|]+", x)
      regmatches(x, m)[[1]]
      
      [1] "f__Closteroviridae" "f__some_virus" 
      

      数据:

      text <- c('d__Viruses|f__Closteroviridae|g__Closterovirus|s__Citrus_tristeza_virus',
                'd__Viruses|o__Tymovirales|f__Alphaflexiviridae|g__Mandarivirus|s__Citrus_yellow_vein_clearing_virus',
                'd__Viruses|o__Ortervirales|f__Retroviridae|s__Columba_palumbus_retrovirus')
      

      【讨论】:

      • 提姆,单词边界(\b)是否也可以用于特殊字符,例如“|” ?您能否解释一下 [^|] 的作用。我知道“^”用于行首,但无法理解结构 [^|]。
      • @KarthikS 单词边界\b,顾名思义,是单词字符(例如字母)和非单词字符(例如管道|)之间的接口。您可能想查看一个好的正则表达式教程。
      猜你喜欢
      • 2021-05-24
      • 2022-08-08
      • 2016-01-02
      • 1970-01-01
      • 2021-05-23
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多